hdu1520Anniversary party(树形dp)

src: http://acm.hdu.edu.cn/showproblem.php?pid=1520

ac代码:

#include <iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<functional>
#include<utility>
#include<string>
#include<string.h>
#include<vector>
#include<iomanip>
#include<stack>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
const int inf=99999999;

int n,v[6005],dp[6005][2],in[6005];
vector<int>head[6005];

void add_edge(int u,int v){head[u].push_back(v);}
void dfs(int u)
{
    dp[u][0]=0;dp[u][1]=v[u];
    for(int i=0;i<head[u].size();i++){
        int v=head[u][i];
        dfs(v);
        dp[u][1]+=dp[v][0];
        dp[u][0]+=max(dp[v][0],dp[v][1]);
    }
    return;
}

int main()
{
    std::ios::sync_with_stdio(false);
    while(cin>>n&&n){
        memset(in,0,sizeof(in));
        memset(dp,0,sizeof(dp));
        FOR(i,1,n)head[i].clear();
        int b,d,rt;
        FOR(i,1,n)cin>>v[i];
        FOR(i,1,n){dp[i][0]=0;dp[i][1]=v[i];}
        while(cin>>b>>d&&b+d){
            add_edge(d,b);
            in[b]++;
        }
        FOR(i,1,n)if(in[i]==0){rt=i;dfs(i);break;}
        cout<<max(dp[rt][0],dp[rt][1])<<endl;

    }
    return 0;
}

 

posted @ 2018-05-07 11:10  WindFreedom  阅读(121)  评论(0)    收藏  举报