1 #include <iostream>
2 #include <cstdio>
3
4 using namespace std;
5
6 struct node
7 {
8 int fro,to,next;
9 }e[36000000];
10 int dp[6000][2];
11 int num=0;
12 int head[6000];
13 int val[6000];
14 bool isye[6000];
15
16 void addEdge(int _fro,int _to)
17 {
18 num++;
19 e[num].fro=_fro;
20 e[num].to=_to;
21 e[num].next=head[_fro];
22 head[_fro]=num;
23 }
24
25 int dfs(int x)
26 {
27 dp[x][0]=0;
28 dp[x][1]=val[x];
29 for(int i=head[x];i!=-1;i=e[i].next)
30 {
31 int v=e[i].to;
32 dfs(v);
33 dp[x][0]+=max(dp[v][0],dp[v][1]);
34 dp[x][1]+=dp[v][0];
35 }
36 return max(dp[x][0],dp[x][1]);
37 }
38
39 int main()
40 {
41 int n;
42 while(scanf("%d",&n)!=EOF)
43 {
44 for(int i=1;i<=n;i++)
45 {
46 scanf("%d",&val[i]);
47 }
48 int a,b;
49 for(int i=0;i<=n;i++)
50 {
51 head[i]=-1;
52 isye[i]=true;
53 }
54 while(scanf("%d%d",&a,&b)!=EOF)
55 {
56 if(a==0&&b==0)
57 break;
58 addEdge(b,a);
59 isye[a]=false;
60 }
61 for(int i=1;i<=n;i++)
62 {
63 if(isye[i])
64 {
65 cout<<dfs(i)<<endl;
66 }
67 }
68 }
69 return 0;
70 }