You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.7 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
/**
8.
v0..vhvh(v)
7.3
2
ici wi di(-1)
* @return
*/
#define maxN 100
#define maxV 1000
int n, v;
int cnt = 0;
int head[maxN];
int wi[maxN], ci[maxN];
int f[maxN][maxV];
struct Edge {
int v, next;
} e[maxN - 1];
void addEdge(int u, int v) {
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt++;
}
void treeDP(int u) {
for (int i = ci[u]; i <= v; i++) {
f[u][i] = wi[u];
}
for (int i = head[u]; i != -1; i = e[i].next) {
int curr = e[i].v;
treeDP(curr);
for (int j = v; j >= 0; j--) {
for (int k = j - ci[u]; k >= 0; k--) {
f[u][j] = max(f[u][j], f[u][j - k] + f[curr][k]);
}
}
}
}
int main(void) {
int cases, root;
freopen("../8.txt", "r", stdin);
cin >> cases;
while (cases--) {
cnt = 0;
memset(head, -1, sizeof(head));
memset(f, 0, sizeof(f));
cin >> n >> v >> root;
for (int i = 0; i < n; i++) {
int di;
cin >> ci[i] >> wi[i] >> di;
addEdge(di, i);
}
treeDP(root);
cout << f[root][v] << endl;
}
}