7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
5
#include<cstdio>
#define N 6005
struct p
{
    int fm;
    int child;
    int brother;
    int att;
    int no;
    void init()
    {
        no=0;
        fm=0;
        brother=0;
        child=0;
    }
    int Max()
    {
        return att>no? att:no;
    }
}num[N];
void dfs(int x)
{
    int child=num[x].child;
    while(child)
    {
        dfs(child);
        num[x].att+=num[child].no;
        num[x].no+=num[child].Max();
        child=num[child].brother;
    }
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            num[i].init();
            scanf("%d",&num[i].att);
        }
        int a,b;
        while(scanf("%d %d",&a,&b),a||b)
        {
            num[a].fm=b;
            num[a].brother=num[b].child;
            num[b].child=a;
        }
        for(int i=1;i<=n;i++)
        {
            if(num[i].fm==0)
            {
                dfs(i);
                printf("%d\n",num[i].Max());
                break;
            }
        }
    }
    return 0;
}
HDU 1520 Anniversary party(DFS或树形DP)
原文:http://blog.csdn.net/u012313382/article/details/44465233