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;
}
原文:https://www.cnblogs.com/ainiyuling/p/11239576.html