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;

}

你可能感兴趣的:(part)