@[FiveFourierTransform](/user/912248)
```
#include <cstdio>
#include <vector>
#include <algorithm>
int dp[6030][2], v[6030], n, r;
std::vector<int>c[6030];
bool has_fa[6030];
void dfs (int i) {
dp[i][1] = v[i];
for (int j = 0; j < c[i].size(); ++j) {
dfs(c[i][j]);
dp[i][0] += std::max(dp[c[i][j]][0], dp[c[i][j]][1]);
dp[i][1] += dp[c[i][j]][0];
}
}
int main () {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &v[i]);
for (int i = 1; i <= n - 1; ++i) {
int l, k;
scanf("%d%d", &l, &k);
c[k].push_back(l);
has_fa[l] = 1;
}
for (int i = 1; i <= n; ++i)
if(!has_fa[i]){
r = i;
break;
}
dfs(r);
printf("%d", std::max(dp[r][0], dp[r][1]));
return 0;
}
by lraM416 @ 2023-03-29 19:58:22