标准的树形dp。
本题只要从1点开始dfs,不断更新dp[i]+=max(dp[v],0)即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int v[32001];
int head[32001],nxt[32001],to[32001],tot=0;
bool vis[32001];
int dp[32001];
int ans;
void add(int x,int y)
{
tot++;
nxt[tot]=head[x];
head[x]=tot;
to[tot]=y;
return;
}
void dfs(int x)
{
vis[x]=1;
for(int i=head[x];i;i=nxt[i])
{
int v=to[i];
if(vis[v])continue;
dfs(v);
dp[x]+=max(dp[v],0);
}
ans=max(ans,dp[x]);
return;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]),dp[i]=v[i];
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs(1);
cout<<ans<<endl;
return 0;
}