#include <bits/stdc++.h>
#define maxn 200001
using namespace std;
int n,i,x,tot,y,ma,f[maxn],record[maxn];
int head[maxn],vis[maxn],dp[maxn],dp_re[maxn],dp_down[maxn];
struct no{
int nxt,to;
}a[maxn];
void jb(int x,int y){
a[++tot].to=y;
a[tot].nxt=head[x];
head[x]=tot;
}
void dfs_down(int u){
vis[u]=1;
if(!f[u]) dp_down[u]=dp_re[u]=0;
for(int i=head[u];i;i=a[i].nxt){
int v=a[i].to;
if(vis[v]) continue;
dfs_down(v);
if(dp_down[u]<dp_down[v]+1) record[u]=v,dp_down[u]=dp_down[v]+1;
else if(dp_re[u]<dp_down[v]+1) dp_re[u]=dp_down[v]+1;
}
}
void dfs_dp(int u){
vis[u]=0;
if(!f[u]) dp[u]=max(0,dp[u]);
for(int i=head[u];i;i=a[i].nxt){
int v=a[i].to;
if(!vis[v]) continue;
if(dp_re[v]<dp_re[u]+1) dp_re[v]=dp_re[u]+1;
int fv=(!(record[u]^v)?dp[u]-1:dp[u]+1);
dp[v]=max(dp_down[v],dp_re[v]);
if(fv>dp[v]) record[v]=0,dp[v]=fv;
dfs_dp(v);
}
}
int main(){
cin>>n;
for(i=1;i<=n;i++) cin>>f[i];
for(i=1;i<=n;i++) dp_re[i]=dp[i]=dp_down[i]=-n;
for(i=1;i<n;i++) cin>>x>>y,jb(x,y),jb(y,x);
dfs_down(1);
dp[1]=dp_down[1];
dfs_dp(1);
for(i=1;i<=n;i++)
if(f[i]) ma=max(ma,dp[i]);
cout<<ma;
}