树形dp新手QAQ
#include <bits/stdc++.h>
using namespace std;
const int N = 6e3 + 5;
int n, r[N], f[N][2];
vector<int> tre[N];
set<int> s;
void dp(int x, int y) {
if (!y) {
for (int i = 0; i < tre[x].size(); i++) {
dp(tre[x][i], 0); dp(tre[x][i], 1);
f[x][y] = max(f[x][y], f[x][y] + max(f[tre[x][i]][0], f[tre[x][i]][1]));
}
} else {
for (int i = 0; i < tre[x].size(); i++) {
dp(tre[x][i], 0);
f[x][y] = max(f[x][y], f[x][y] + f[tre[x][i]][0]);
}
f[x][y] += r[x];
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> r[i];
for (int i = 1; i <= n; i++) s.insert(i);
for (int i = 1; i <= n - 1; i++) {
int l, k;
cin >> l >> k;
s.erase(l);
tre[k].push_back(l);
}
dp(*s.begin(), 1); dp(*s.begin(), 0);
cout << max(f[*s.begin()][0], f[*s.begin()][1]) << endl;
return 0;
}