hdu 1520 Anniversary party

这一题是我写的第一个树形dp题。

View Code
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;

const int INF = 6005;
int l[INF],r[INF];
int d[INF],w[INF];
bool vis[INF],in[INF];
int dp[INF][2];

void add(int x,int y){
    if(d[x]==0)l[x]=y;
    else r[d[x]]=y;
    d[x]=y;
}

void dfs(int idx){
    int k,t;
    if(vis[idx])return;
    vis[idx]=1;
    if(l[idx]==0){
        dp[idx][0]=0;
        dp[idx][1]=w[idx];
        return;
    }
    k = l[idx];
    while(k){
        dfs(k);
        dp[idx][0]+=max(dp[k][0],dp[k][1]);
        dp[idx][1]+=dp[k][0];
        k=r[k];
    }
    dp[idx][1]+=w[idx];
}
int main(){
    int n,a,b,ans=0;
    while(scanf("%d",&n)!=EOF){
    memset(vis,0,sizeof(vis));
    memset(dp,0,sizeof(dp));
    memset(l,0,sizeof(l));
    memset(r,0,sizeof(r));
    memset(d,0,sizeof(d));
    for(int i=1;i<=n;i++){
        scanf("%d",&w[i]);
    }
    while(scanf("%d%d",&a,&b),a||b){
        add(b,a);
        in[a]=1;
    }
    for(int i=1;i<=n;i++){
        if(!in[i]){
            dfs(i);
            ans=max(dp[i][0],dp[i][1]);
            break;
        }
    }
    printf("%d\n",ans);
    }
    return 0;
}
posted @ 2012-07-27 16:27  HNU_AlienForce  阅读(127)  评论(0)    收藏  举报