表示第个人有没有去舞会 如果去了 flag=1,否则flag=0
显然如果去了那么他的下属必定不会去
如果没去那么他的下属去不去都行,我们要选一个最大值
我们先找出树根rt 最终我们需要的答案是
#include<bits/stdc++.h>
using namespace std;
const int N = 6e3+100;
int cur,h[N],to[N<<1],nex[N<<1],ans[N][2],f[N];
void add_edge(int x,int y){
to[++cur]=y,nex[cur]=h[x],h[x]=cur;
}
void dfs(int u,int fath){
ans[u][0]=0;
for(int i = h[u]; i; i = nex[i]){
if(to[i]!=fath){
dfs(to[i],u);
ans[u][0]+=max(ans[to[i]][0],ans[to[i]][1]);
ans[u][1]+=ans[to[i]][0];
}
}
}
int main(){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++) scanf("%d",&ans[i][1]);
for(int i = 1; i <= n; i++){
int u,v;
scanf("%d%d",&u,&v);
if(i!=n){
add_edge(v,u);
f[u]=v;
}
}
int rt;
for(int i = 1; i <= n; i++) if(f[i]==0) rt=i;
//printf("rt=%d\n",rt);
dfs(rt,0);
printf("%d\n",max(ans[rt][1],ans[rt][0]));
return 0;
}