hdu 1520 (树形DP)

dp[i][0]表示i不参加

dp[i][1]表示i参加

简单的树形dp




 

#include<stdio.h>

#include<string.h>

#define N 6100

#define inf 0x3fffffff

int dp[N][2],vis[N],head[N],num,n,lo[N],mm;

struct edge

{

    int st,ed,next;

}E[N*2];

void addedge(int x,int y)

{

    E[num].st=x;

    E[num].ed=y;

    E[num].next=head[x];

    head[x]=num++;

}

int max(int a,int b)

{

    if(a>b)return a;

    return b;

}

void dfs(int u)

{

    int v,i;

    dp[u][0]=0;

    dp[u][1]=lo[u];

    vis[u]=1;

    for(i=head[u];i!=-1;i=E[i].next)

    {

        v=E[i].ed;

        if(vis[v]==1)continue;

        dfs(v);

        dp[u][0]+=max(dp[v][1],dp[v][0]);

        dp[u][1]+=dp[v][0];

    }

}

int main()

{

    int i,x,y;

    while(scanf("%d",&n)!=-1)

    {

        for(i=1;i<=n;i++)

            scanf("%d",&lo[i]);

        memset(head,-1,sizeof(head));

        num=0;

        while(scanf("%d%d",&x,&y),x||y)

        {

            addedge(x,y);

            addedge(y,x);

        }

        memset(vis,0,sizeof(vis));

        dfs(1);

        printf("%d\n",dp[1][0]>dp[1][1]?dp[1][0]:dp[1][1]);

    }

    return 0;

}


 

 

你可能感兴趣的:(HDU)