#include<bits/stdc++.h>
using namespace std;
#define MAXN 200001
int maxn=0;
int n;int co[MAXN];
vector<int>Edge[MAXN];
pair<int,int> dfs(int x,int father){
int w=0,b=0;
for(int i=0;i<Edge[x].size();i++){
int to=Edge[x][i];
if(to==father)continue;
pair<int,int> med=dfs(to,x);
int white_len=med.first,black_len=med.second;
if(b!=0)maxn=max(maxn,white_len + b);
if(w!=0)maxn=max(maxn,black_len + w);
w = max(w,white_len); b = max(b,black_len);
}
if(co[x]==0)maxn=max(maxn,b);
else maxn=max(maxn,w);
pair<int,int> ret; ret.first=ret.second=0;
if(co[x]==0)ret.first=1;
else ret.second=1;
if(w!=0)ret.first=w+1;
if(b!=0)ret.second=b+1;
return ret;
}
int main()
{
int x,y;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&co[i]);
for(int i=1;i<=n-1;i++){
scanf("%d%d",&x,&y);
Edge[x].push_back(y); Edge[y].push_back(x);
}
dfs(1,0);
printf("%d\n",maxn);
return 0;
}