1 条题解

  • 0
    @ 2025-5-25 8:53:57
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int MAXN = 2000;
    int n, k;
    vector<pair<int, int>> e[MAXN + 5];
    int siz[MAXN + 5]; // 子树大小
    int f[MAXN + 5][MAXN + 5];
    // 当前节点,父节点
    void dfs(int u, int fa)
    {
        siz[u] = 1;
        for (int i = 0; i < e[u].size(); i++)
        {
            int v = e[u][i].first;
            int w = e[u][i].second;
            if (v == fa)
                continue;
            dfs(v, u);
            siz[u] += siz[v];
            for (int j = min(siz[u], k); j >= 0; j--) // 一共提供 j 个黑点
            {
                for (int jj = max(j - siz[u] + siz[v], 0LL); jj <= min(siz[v], j); jj++) // 这个子树提供 jj 个黑点
                {
                    // u~v 这条边带来的贡献
                    int now = 0;
                    now += w * jj * (k - jj);                           // 黑点对
                    now += w * (siz[v] - jj) * (n - k - (siz[v] - jj)); // 白点对
                    f[u][j] = max(f[u][j], f[u][j - jj] + f[v][jj] + now);
                }
            }
        }
    }
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> k;
        k = min(k, n - k);
        for (int i = 1; i <= n - 1; i++)
        {
            int u, v, w;
            cin >> u >> v >> w;
            e[u].push_back({v, w});
            e[v].push_back({u, w});
        }
        dfs(1, 0);
        cout << f[1][k];
        return 0;
    }
    

    信息

    ID
    4014
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    26
    已通过
    10
    上传者