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
| #include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int Maxn = 2e3 + 5; int N, K, U, V, W, Size[Maxn]; int Head[Maxn], E[Maxn << 1], Cost[Maxn << 1], Next[Maxn << 1], Cur; ll Dp[Maxn][Maxn];
inline void AddEdge(int U, int V, int W) { Next[++Cur] = Head[U]; Head[U] = Cur; E[Cur] = V; Cost[Cur] = W; }
void DFS(int U, int _F) { Size[U] = 1; Dp[U][0] = Dp[U][1] = 0; for (int i = Head[U]; i; i = Next[i]) { int V = E[i]; if (V == _F) continue; DFS(V, U); Size[U] += Size[V]; int W = Cost[i]; for (int i = min(K, Size[U]); i >= 0; --i) for (int j = 0; j <= min(i, Size[V]); ++j) { if (Dp[U][i - j] == -1) continue; ll Val = W * ((ll)j * (K - j) + (ll)(Size[V] - j) * (N - K + j - Size[V])); Dp[U][i] = max(Dp[U][i], Dp[U][i - j] + Dp[V][j] + Val); } } }
int main() { memset(Dp, -1, sizeof Dp); scanf ("%d %d", &N, &K); for (int i = 1; i < N; ++i) { scanf ("%d %d %d", &U, &V, &W); AddEdge (U, V, W), AddEdge(V, U, W); } DFS (1, 0); printf ("%lld\n", Dp[1][K]); system ("pause"); }
|