刚学树形DP,60pts
#include<bits/stdc++.h>
using namespace std;
vector<int>tr[1086];
int f[1086][2];
bool v[1086];
int a[1086];
int n;
void dfs(int op){
f[op][0]=0;
f[op][1]=a[op];
for(int i:tr[op]){
dfs(i);
f[op][0]+=max(f[i][0],f[i][1]);
f[op][1]+=f[i][0];
}
}
int main() {
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++) {
int x,y;
cin>>x>>y;
v[x]=true;
tr[y].push_back(x);
}
int root;
for(int i=1;i<=n;i++)
if(!v[i]){
root=i;
break;
}
dfs(root);
cout<<max(f[root][0],f[root][1]);
return 0;
}
悬2关