1. 程式人生 > >poj2342 沒有上司的舞會 樹形dp基礎

poj2342 沒有上司的舞會 樹形dp基礎

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
int n,dp[6050][2],flag[6050],h[6050];
vector<int> son[6050];

void dfs(int u){
    dp[u][0]=0;
    dp[u][1]=h[u];
    for(int i=0;i<son[u].size();i++){
        int v=son[u][i];
        dfs(v);
        dp[u][
0]+=max(dp[v][0],dp[v][1]); dp[u][1]+=dp[v][0]; } } int main(){ while(scanf("%d",&n),n){ memset(h,0,sizeof h); memset(flag,0,sizeof flag); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++)scanf("%d",&h[i]); for(int i=1;i<n;i++){
int u,v; scanf("%d%d",&v,&u); son[u].push_back(v); flag[v]=1; } int root; for(int i=1;i<=n;i++) if(!flag[i]){root=i;break;} dfs(root); printf("%d\n",max(dp[root][0],dp[root][1])); } }