1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5
6 struct node
7 {
8 int to, w, nxt;
9 node() {};
10 node(int a, int b, int c)
11 {
12 to = a;
13 w = b;
14 nxt = c;
15 }
16 };
17
18 node g[3001];
19 int s[3001];
20 int cnt;
21 int u[3001];
22 int n, m;
23 int dp[3001][3001];
24
25 void add(int f, int t, int w)
26 {
27 g[++cnt] = node(t, w, s[f]);
28 s[f] = cnt;
29 }
30
31 int dfs(int t)
32 {
33 if (t > n - m)
34 {
35 dp[t][1] = u[t];
36 dp[t][0] = 0;
37 return 1;
38 }
39 dp[t][0] = 0;
40 int sum = 0;
41 for (int i = s[t]; i > 0; i = g[i].nxt)
42 {
43 int v = g[i].to;
44 int w = g[i].w;
45 int num = dfs(v);
46 sum += num;
47 for (int j = sum; j > 0; j--)
48 {
49 for (int k = 0; k <= min(j, num); k++)
50 dp[t][j] = max(dp[t][j], dp[t][j - k] + dp[v][k] - w);
51 }
52 }
53 return sum;
54 }
55
56 int main()
57 {
58 //cout<<0x8f<<endl;
59 cin >> n >> m;
60 for (int i = 1; i <= n - m; i++)
61 {
62 int num;
63 cin >> num;
64 for (int j = 0; j < num; j++)
65 {
66 int v, nxt;
67 cin >> v >> nxt;
68 add(i, v, nxt);
69 }
70 }
71 for (int i = n - m + 1; i <= n; i++)
72 cin >> u[i];
73 memset(dp, 0x8f, sizeof(dp));
74 memset(dp, 0, sizeof(dp[0]));
75 dfs(1);
76 for (int i = m; i >= 0; i--)
77 {
78 if (dp[1][i] >= 0)
79 {
80 cout << i << endl;
81 break;
82 }
83 }
84 }