思路是DFS,d0与d1分别代表这个人去与不去时的最高快乐指数。
只能AC两个点,感谢各位大佬!
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10005;
struct Node{
int d0,d1,r;
vector<int> son;
Node(){
d0 = d1 = r = 0;
}
};
Node st[MAXN];
bool flag[MAXN];
void dfs(int pos){
st[pos].d0 = 0;
st[pos].d1 = st[pos].r;
for(int i = 0;i < st[pos].son.size();i++){
dfs(st[pos].son[i]);
st[pos].d0 += max(st[st[pos].son[i]].d0,st[st[pos].son[i]].d1);
st[pos].d1 += st[st[pos].son[i]].d0;
}
}
int main(){
int n,l,k,ans = -99999,root = 1;
cin >> n;
for(int i = 0;i < n;i++){
cin >> st[i].r;
}
for(int i = 0;i < n-1;i++){
cin >> l >> k;
flag[l] = true;
st[k].son.push_back(l);
}
for(int i = 0;i < n;i++){
if(!flag[i]){
root = i;
break;
}
}
dfs(root);
for(int i = 0;i < n;i++){
ans = max(ans,max(st[i].d0,st[i].d1));
}
cout << ans;
return 0;
}