hdu 1520-树形dp

来源:互联网 发布:php支付宝支付流程 编辑:程序博客网 时间:2024/06/08 16:34

用了dp和dfs,构建树的方法不熟练,dfs写的也较少

----------------------------------------------------------------------------------------

#include<string.h>
#include<stdio.h>
#define N 6005
#define max(a,b) a>b?a:b


struct node{
    int from,to,next;
};
node edges[N*2];
int val[N],tol;
int head[N],degree[N],dp[N][2],visit[N];
int n;
void Add(int a,int b)
{
    edges[tol].from=a;edges[tol].to=b;
    edges[tol].next=head[a];
    head[a]=tol++;
}
void dfs(int x)
{
    visit[x]=0;
    int ans0,ans1;
    int j,u;
    ans1=ans0=0;


    for(j=head[x];j!=-1;j=edges[j].next)
    {
        u=edges[j].to;
        if(!visit[u])   dfs(u);
        ans0+=max(dp[u][1],dp[u][0]);
        ans1+=dp[u][0];
    }
    dp[x][1]=ans1+val[x];
    dp[x][0]=ans0;
}
int main()
{
    int i,a,b,sum;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)   scanf("%d",&val[i]);
        memset(head,-1,sizeof(head));
        memset(degree,0,sizeof(degree));
        tol=0;
        while(scanf("%d%d",&a,&b) && a+b)
        {
            Add(b,a);
            degree[a]++;
        }
        memset(dp,0,sizeof(dp));
        memset(visit,0,sizeof(visit));
        sum=0;
        for(i=1;i<=n;i++)
        {
            if(degree[i]==0)
            {
                dfs(i);
                sum+=max(dp[i][0],dp[i][1]);
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}