AC

许诺  •  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;

}


评论:

请先登录,才能进行评论