1 #include<iostream>
2 #include<stdio.h>
3 #include<string.h>
4 #include<vector>
5 #include<algorithm>
6 using namespace std;
7
8 vector < int > g[6002];
9 int w[6002],d[6002][2];
10
11 __int64 dfs(int i,int j,int f)
12 {
13 if(d[i][j]!=-1) // 注意要记录 不然会超时
14 {
15 return d[i][j];
16 }
17 __int64 ans=0; //点i 不在 一定合法
18
19 for(int k=0; k<g[i].size(); k++)
20 {
21 int v=g[i][k];
22 if(v!=f)
23 ans+=dfs(v,0,i);
24 }
25 if(j==0) //只有i 的父亲 不在i才能在
26 {
27 __int64 sum=w[i];
28 for(int k=0; k<g[i].size(); k++)
29 {
30 int v=g[i][k];
31 if(v!=f)
32 sum+=dfs(v,1,i);
33 }
34 ans=max(ans,sum);
35 }
36 return d[i][j]=ans;
37 }
38
39 int main()
40 {
41 int i,j,n,m,t,a,b;
42 while(scanf("%d%d",&n,&w[1])!=EOF)
43 {
44 for(i=0; i<=n; i++)
45 g[i].clear();
46 for(i=2; i<=n; i++)
47 scanf("%d",&w[i]);
48 for(i=1; ; i++)
49 {
50 scanf("%d%d",&a,&b);
51 if(a==0&&b==0)
52 break;
53 g[a].push_back(b);
54 g[b].push_back(a);
55 }
56 memset(d,-1,sizeof(d));
57 printf("%I64d\n",dfs(1,0,-1));
58 }
59 return 0;
60 }