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;
}


 

 

posted on 2013-07-31 19:50  you Richer  阅读(153)  评论(0编辑  收藏  举报