/* 作者:千里冰封 题目:p1380 没有上司的舞会 */ // // Created by ice1000 on 2016/7/5. // #include #include using namespace std; const int size = 6005; int n, dp[size][2], r[size], f[size]; vector vec[size]; void dfs(int i); void init(); int main(int argc, char *argv[]) { // init(); int l, k, out = -1; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &r[i]); } for (int i = 1; i < n; i++) { scanf("%d %d", &l, &k); vec[k].push_back(l); f[l] = k; } scanf("%d %d", &l, &k); for (int i = 1; i <= n; i++) { if (!f[i]) { dfs(i); out = max(dp[i][0], dp[i][1]); break; } } printf("%d\n", out); return 0; } void dfs(int root) { for (int i = 0; i < vec[root].size(); i++) { int j = vec[root][i]; dfs(j); dp[root][0] += max(dp[j][0], dp[j][1]); dp[root][1] += dp[j][0]; } dp[root][1] += r[root]; }