#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=6010; int f[N][2],n,happy[N]; int h[N],e[N],ne[N],idx; bool has_father[N]; void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs(int u){ f[u][1]=happy[u]; for(int i=h[u];~i;i=ne[i]){ int j=e[i]; dfs(j); f[u][0]+=max(f[j][0],f[j][1]); f[u][1]+=f[j][0]; } } int main(void){ cin>>n; memset(h,-1,sizeof h); for(int i=1;i<=n;i++)cin>>happy[i]; for(int i=1;i<n;i++){ int a, b; cin>>a>>b; has_father[a]=true; add(b,a); } int root=1; while(has_father[root])root++; dfs(root); cout<<max(f[root][0],f[root][1]); return 0; }
树形DP--没有上司的舞会
猜你喜欢
转载自www.cnblogs.com/programyang/p/11246474.html
今日推荐
周排行