许诺 • 1个月前
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; vector<vector> children; vector happy; vector<vector> dp; void dfs(int node) {
dp[node][1] = happy[node];
for (int child : children[node]) {
dfs(child);
dp[node][1] += dp[child][0];
dp[node][0] += max(dp[child][0], dp[child][1]);
}
} int main() {
int N;
cin >> N;
happy.resize(N + 1);
children.resize(N + 1);
dp.resize(N + 1, vector<int>(2, 0));
for (int i = 1; i <= N; ++i) {
cin >> happy[i];
}
vector<bool> isRoot(N + 1, true);
int L, K;
while (cin >> L >> K) {
if (L == 0 && K == 0) break;
children[K].push_back(L);
isRoot[L] = false;
}
int root = -1;
for (int i = 1; i <= N; ++i) {
if (isRoot[i]) {
root = i;
break;
}
}
dfs(root);
cout << max(dp[root][0], dp[root][1]) << endl;
return 0;
}
评论:
请先登录,才能进行评论