#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge
{
int v,nxt;
}e[1000005];
struct node
{
int val,dis,len;
}q[500005];
int h[500005],cnt,n,m,u,v,c[500005],f[500005],size[500005];
bool cmp(node a,node b)
{
return a.val>b.val;
}
void add(int u,int v)
{
e[++cnt].v=v;
e[cnt].nxt=h[u];
h[u]=cnt;
}
void dfs(int u,int fa)
{
size[u]=1;f[u]=c[u];cnt=0;
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==fa)continue;
dfs(v,u);
q[++cnt]=(node){f[v]-2*size[v]+2,f[v]+1,2*size[v]};
size[u]+=size[v];
}
sort(q+1,q+cnt+1,cmp);
int sum=0;
for(int i=1;i<=cnt;i++)
{
f[u]=max(f[u],q[i].val+sum);
sum+=q[i].dis;
q[i]=(node){0,0,0};
}
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&c[i]);
for(int i=1;i<n;i++)
{
scanf("%lld%lld",&u,&v);
add(u,v);
add(v,u);
}
dfs(1,0);
printf("%lld",max(f[1],2*n-2+c[1]));
return 0;
}