1 条题解
-
0
#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
- 上传者