没有上司的舞会
dp[i][0]=sum(max(dp[son][1],dp[son][0]));
dp[i][1]=sum(dp[son][0])+happy[i];
#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> using namespace std; int n; int root; int value[10005]; int u,v; int head[10005],cnt; int f[10005][2]; int jl[10005]; struct note { int next; int to; }edge[10005]; int add(int u,int v) { cnt++; edge[cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt; return 0; } int dp(int x) { for(int i=head[x];i;i=edge[i].next) { //if(x==2)printf("1\n"); int v=edge[i].to; //printf("%d %d %d %d\n",x,v,f[x][0],f[x][1]); dp(v); //printf("%d %d %d %d\n",x,v,f[v][0],f[v][1]); //printf("%d %d %d\n",x,f[x][0],f[x][1]); f[x][0]+=max(f[v][1],f[v][0]); f[x][1]+=f[v][0]; //printf("%d %d %d\n",x,f[x][0],f[x][1]); } //printf("%d %d %d\n",x,f[x][0],f[x][1]); //if(x==2)printf("%d\n",f[3][0]); f[x][1]+=value[x]; //if(x==2)printf("%d\n",f[3][0]); return 0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&value[i]); for(int i=1;i<=n-1;i++) { scanf("%d%d",&u,&v); add(v,u); jl[u]++; } for(int i=1;i<=n;i++) { if(jl[i]==0) { root=i; break; } } //printf("%d\n",f[3][0]); dp(root); //printf("%d\n",f[4][0]); printf("%d",max(f[root][0],f[root][1])); return 0; }