没有上司的舞会,树形dp
#include<bits/stdc++.h>
#define mms(a) memset(a,-1,sizeof(a))
using namespace std;
int dp[6010][2],fr[6010]; #dp[i][1]表示该节点参加舞会时,该子树的最大值
vector<int> v[6010];
int dfs(int next){
for(int i=0;i<v[next].size();i++){
dfs(v[next][i]);
dp[next][0]+=max( dp[ v[next][i] ][1],dp[ v[next][i] ][0] );
dp[next][1]+=dp[ v[next][i] ][0];
}
return 0;
}
int main(){
int n,root;
cin>>n;
for(int i=1;i<=n;i++){
dp[i][0]=0;
scanf("%d",&dp[i][1]);
v[i].clear();
fr[i]=0;
}
int b,c;
for(int i=1;i<n;i++){
cin>>c>>b;
v[b].push_back(c);
fr[c]=1;
}
cin>>b>>c;
for(int i=1;i<=n;i++){
if(!fr[i]){
root=i;
break;
}
}
dfs(root);
cout<<max(dp[root][1],dp[root][0])<<endl;
return 0;
}