HDOJ 1520 Anniversary party(树DP)

题意:求树的最大点独立集中点的数目。

View Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 6001
int n,e;
int w[N],first[N],next[N],v[N],p[N];
int dp[N][2];
void init()
{
    e=0;
    memset(first,-1,sizeof(first));
    memset(p,0,sizeof(p));
    memset(dp,0,sizeof(dp));
}
void add(int a,int b)
{
    v[e]=b;
    next[e]=first[a];
    first[a]=e++;
}
void dfs(int a)
{
    dp[a][0]=0;
    dp[a][1]=w[a];
    int i,b;
    for(i=first[a];~i;i=next[i])
    {
        b=v[i];
        if(b==p[a]) continue;
        dfs(b);
        dp[a][0]+=max(dp[b][0],dp[b][1]);
        dp[a][1]+=dp[b][0];
    }
}
int main()
{
    int a,b;
    while(~scanf("%d",&n))
    {
        init();
        for(int i=1;i<=n;i++)   scanf("%d",&w[i]);
        do
        {
            scanf("%d%d",&a,&b);
            if(!p[a])
            {
                p[a]=b;
                add(b,a);
            }
        }while(a|b);
        for(int i=1;i<=n;i++)
        {
            if(p[i]==0)
            {
                dfs(i);
                printf("%d\n",max(dp[i][0],dp[i][1]));
                break;
            }
        }
    }
    return 0;
}
posted @ 2012-09-17 17:13  BeatLJ  阅读(186)  评论(0编辑  收藏  举报