poj2342 没有上司的舞会 树形dp基础

时间:2022-08-25 14:03:14
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
int n,dp[][],flag[],h[];
vector<int> son[]; void dfs(int u){
dp[u][]=;
dp[u][]=h[u];
for(int i=;i<son[u].size();i++){
int v=son[u][i];
dfs(v);
dp[u][]+=max(dp[v][],dp[v][]);
dp[u][]+=dp[v][];
}
} int main(){
while(scanf("%d",&n),n){
memset(h,,sizeof h);
memset(flag,,sizeof flag);
memset(dp,,sizeof dp);
for(int i=;i<=n;i++)scanf("%d",&h[i]);
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&v,&u);
son[u].push_back(v);
flag[v]=;
} int root;
for(int i=;i<=n;i++)
if(!flag[i]){root=i;break;} dfs(root);
printf("%d\n",max(dp[root][],dp[root][]));
}
}