#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
const int MAXN=20000+5;
struct node
{
int v;
int next;
}tree[MAXN];
int vis[MAXN],head[MAXN],dp[MAXN][2];
int ptr,n;
void init()
{
ptr=0;
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
}
void addedge(int x,int y)//y is x's son
{
tree[ptr]=(node){y,head[x]};
head[x]=ptr++;
}
void dfs(int cur)
{
vis[cur]=1;
for(int i=head[cur];i!=-1;i=tree[i].next)
{
int v=tree[i].v;
if(!vis[v])
{
dfs(v);
dp[cur][1]+=dp[v][0];
dp[cur][0]+=max(dp[v][1],dp[v][0]);
}
}
}
int main()
{
int n,a,b;
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=1;i<=n;i++) scanf("%d",&dp[i][1]);
while(scanf("%d%d",&a,&b),a+b)
{
addedge(a,b);
addedge(b,a);
}
dfs(1);
printf("%d\n",max(dp[1][0],dp[1][1]));
}
return 0;
}
HDU 1520
最新推荐文章于 2019-08-01 21:08:51 发布