#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; #define inf 0x7fffffff inline int read() { int x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-')f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x*f; } struct edge { int to, next; } e[6001]; int n, cnt, a[6001], head[6001], f[6001][2]; bool in[6001]; inline void ins(int u, int v) { e[++cnt] = (edge){v, head[u]}; head[u] = cnt; } inline void dp(int x) { f[x][1] = a[x]; for (int i = head[x]; i; i = e[i].next) { dp(e[i].to); f[x][1] += f[e[i].to][0]; f[x][0] += max(f[e[i].to][1], f[e[i].to][0]); } } int main() { n = read(); for (int i = 1; i <= n; i++) a[i] = read(); for (int i = 1; i <= n; i++) { int l = read(), k = read(); if (!l&&!k)break; ins(k, l); in[l] = 1; } for (int i = 1; i <= n; i++) { if (!in[i]) { dp(i); printf("%d", max(f[i][1], f[i][0])); return 0; } } }