求调,样例1输出2,悬赏2关注
#include <iostream>
#include <cstdio>
#define MAXN 6005
using namespace std;
int n;
struct str{
int val;
int fa;
int snum, son[MAXN];
} tree[MAXN];
int dp[MAXN][2];
void dfs(int u) {
dp[u][0] = 0; dp[u][1] = tree[u].val;
for (int v = 1; v <= tree[u].snum; ++v) {
//cout << u << " " << v << endl;
dfs(tree[u].son[v]);
dp[u][0] += max(dp[v][0], dp[v][1]);
dp[u][1] += dp[v][0];
}
return ;
}
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> tree[i].val;
}
for (int i = 1; i < n; ++i) {
int x, y;
cin >> x >> y;
tree[y].snum += 1;
tree[y].son[tree[y].snum] = x;
tree[x].fa = y;
}
int root;
for (int i = 1; i <= n; ++i) {
if (tree[i].snum == 0) {
dp[i][0] = 0;
dp[i][1] = tree[i].val;
}
if (tree[i].fa == 0) {
root = i;
}
}
dfs(root);
cout << max(dp[root][0], dp[root][1]) << endl;
return 0;
}