#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]));
}
}
转载于:https://www.cnblogs.com/zsben991126/p/10223009.html
转载请注明原文地址: https://win8.8miu.com/read-14724.html