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 62
| ##include "bits/stdc++.h" using namespace std;
const ll INF = 0x3f3f3f3f;
const int N = 5e3 + 10; int d[N], siz[N], val[N]; int f[N][N];
struct Edge { int v, next, w; }e[N]; int head[N], cnt;
inline void add(int u, int v, int w) { e[++cnt].v = v; e[cnt].w = w; e[cnt].next = head[u]; head[u] = cnt; }
void dfs(int u, int fa) { f[u][0] = 0; for(int i = head[u]; i; i = e[i].next) { int v = e[i].v; if(v == fa) continue; dfs(v, u); siz[u] += siz[v]; for(int j = siz[u];j >= 0; j--) { for(int k = 1;k <= min(j, siz[v]); k++) { f[u][j] = max(f[u][j], f[u][j - k] + f[v][k] - e[i].w); } } } if(d[u] == 1) f[u][1] = val[u], siz[u] = 1; }
void solve() { int n, m; cin >> n >> m; mem(f, -INF); for(int i = 1;i <= n - m; i++) { int k; cin >> k; for(int j = 1;j <= k; j++) { int a, c; cin >> a >> c; d[i]++; d[a]++; add(i, a, c); add(a, i, c); } } for(int i = n - m + 1;i <= n; i++) cin >> val[i]; dfs(1, -1); for(int i = m;i >= 0; i--) { if(f[1][i] >= 0) { cout << i << endl; return ; } } }
signed main() { solve(); }
|