最大子樹和
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
void add(int x,int y)
{
tree[++cnt].next=head[x];
tree[cnt].to=y;
head[x]=cnt;
}
void dfs(int u,int fa)
{
f[u]=a[u];
for(int i=head[u];i;i=tree[i].next)
int v=tree[i].to;
if(v!=fa)
{
dfs(v,u);
f[u]+=max(0,f[v]);
}
}
ans=max(ans,f[u]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1,x,y;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1,0);
printf("%d\n",ans);
}