#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=16000+50;
int n,a[maxn];
int head[maxn];
vector <int> G[maxn];
int dp[maxn];
int _ans=-1000;
int dfs(int x, int pa) {
int& ans = dp[x];
if(ans>=0)return dp[x];
ans=a[x];
for(int i = 0; i < G[x].size(); i++) {
int& t = G[x][i];
if(t != pa) {
ans+=max(dfs(t, x),0);
}
}
ans=max(ans,0);
_ans=max(ans,0);
return ans;
}
int main() {
cin>>n;
memset(dp,-1,sizeof(dp));
for(int i=1; i<=n; ++i)
cin>>a[i];
for(int i=0; i<n-1; ++i) {
int u, v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
cout<<dfs(1,0);
return 0;
}
提交记录