#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int fa[7000];
int dp[7000][5];
int vis[7000];
int n;
void dfs(int rt)
{
int i,j,k;
vis[rt]=1;
for(i=1;i<=n;i++)
{
if(vis[i]==0&&fa[i]==rt)
{
dfs(i);
dp[rt][1]+=dp[i][0];
dp[rt][0]+=max(dp[i][0],dp[i][1]);
}
}
}
int main()
{
int i,j;
int l,k;
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
fa[i]=i;
scanf("%d",&dp[i][1]);
}
while(scanf("%d%d",&l,&k),l+k)
{
fa[l]=k;
}
int rt;
for(i=1;i<=n;i++)
{
if(fa[i]==i) rt=i;
}
dfs(rt);
printf("%d\n",max(dp[rt][0],dp[rt][1]));
return 0;
}
poj 2342 Anniversary party (树形dp)
原文:http://www.cnblogs.com/sola1994/p/4694620.html