1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include<bits/stdc++.h> using namespace std; #define int long long const int MAXn = 2e3; const int MAXm = MAXn; const int MAXk = 2e3;
template <typename T> inline void read(T &a) { register char c;while (c = getchar(), c < '0' || c > '9');register T x(c - '0');while (c = getchar(), c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);}a = x; } template <typename T, typename ...Argv> inline void read(T &n, Argv &...argv) { read(n), read(argv...); }
int head[MAXm + 10], cntnex, nex[MAXm * 2 + 10], to[MAXm * 2 + 10], wei[MAXm * 2 + 10]; inline void Insert(int u, int v, int w) { nex[++cntnex] = head[u]; head[u] = cntnex; to[cntnex] = v; wei[cntnex] = w; }
int n, m, fa[MAXn + 10], siz[MAXn + 10], d[MAXn + 10][MAXk + 10]; void Dfs(int cur) { siz[cur] = 1; for (int i = head[cur]; i; i = nex[i]) { if (to[i] == fa[cur]) continue; fa[to[i]] = cur; Dfs(to[i]); siz[cur] += siz[to[i]]; } } void DfsDp(int cur) { d[cur][0] = d[cur][1] = 0; for (int i = head[cur]; i; i = nex[i]) { if (to[i] == fa[cur]) continue; DfsDp(to[i]); for (int j = min(m, siz[cur]); ~j; --j) { for (int k = 0; k <= min(j, siz[to[i]]); ++k) { d[cur][j] = max(d[cur][j], d[cur][j - k] + d[to[i]][k] + wei[i] * (k * (m - k) + (siz[to[i]] - k) * (n - siz[to[i]] - (m - k)))); } } } }
signed main() { memset(d, 0xc0, sizeof(d)); read(n, m); if (n < m * 2) { m = n - m; } for (int i = 1, u, v, w; i < n; ++i) { read(u, v, w); Insert(u, v, w); Insert(v, u, w); } Dfs(1); DfsDp(1); printf("%lld\n", d[1][m]); }
|