![]()
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <vector>
5 using namespace std;
6
7 const int MAXN=(int)6e3+10;
8
9 int n;
10 int r[MAXN];
11 bool flag[MAXN];
12 vector<int> vec[MAXN];
13 int dp[MAXN][2]; //i号职员去(1)或不去(0)的快乐指数
14
15 void dfs(int u)
16 {
17 dp[u][0]=0;
18 dp[u][1]=r[u];
19 for (int i=0;i<(int)vec[u].size();i++)
20 {
21 int v=vec[u][i];
22 dfs(v);
23 //类似pushUp,求出子树的dp再向上更新根结点的dp
24 dp[u][0]+=max(dp[v][0],dp[v][1]);
25 dp[u][1]+=dp[v][0];
26 }
27 return;
28 }
29
30 int main()
31 {
32 scanf("%d",&n);
33 for (int i=1;i<=n;i++) scanf("%d",&r[i]);
34 memset(flag,false,sizeof(flag));
35
36 for (int i=1;i<n;i++)
37 {
38 int l,k;
39 scanf("%d%d",&l,&k);
40 vec[k].push_back(l);
41 flag[l]=true;
42 }
43
44 int rt;
45 for (int i=1;i<=n;i++) //求根结点(校长)
46 {
47 if (!flag[i])
48 {
49 rt=i;
50 break;
51 }
52 }
53
54 dfs(rt);
55 printf("%d\n",max(dp[rt][1],dp[rt][0]));
56
57 return 0;
58 }