#include<bits/stdc++.h>
#define ull unsigned long long
#define int long long
#define pii pair<int,int>
#define se second
#define fi first
using namespace std;
const int MAXN=1e6+10;
int n,w[MAXN],mx[MAXN];
struct node{
int to,nxt;
}a[MAXN<<1];
int head[MAXN],tot,dis[MAXN];
pii dp[MAXN][2];
void add(int x,int y){
a[++tot].to=y;
a[tot].nxt=head[x];
head[x]=tot;
}
void dfs1(int now,int fa,int dep){
dis[now]=dep;dp[now][0]=make_pair(now,dep);bool f=0;
for(int i=head[now];i;i=a[i].nxt){
int to=a[i].to;
if(to==fa) continue;f=1;
if(w[now]==w[to]) dfs1(to,now,dep);
else dfs1(to,now,dep+1);
if(dp[to][0].se>=dp[now][0].se) dp[now][1]=dp[now][0],dp[now][0]=make_pair(to,dp[to][0].se);
else if(dp[to][0].se>=dp[now][1].se) dp[now][1]=make_pair(to,dp[to][0].se);
}
if(!f&&(!w[now])) dp[now][0]=make_pair(-1,-1);
}
void dfs2(int now,int fa){
for(int i=head[now];i;i=a[i].nxt){
int to=a[i].to;
if(to==fa) continue;
mx[to]=mx[now];
if(w[now]!=w[to])mx[to]++;
if(dp[now][0].fi!=to) mx[to]=max(mx[to],dp[now][0].se-dis[now]+1+(w[now]!=w[to]));
else if(dp[now][1].fi!=now) mx[to]=max(mx[to],dp[now][1].se-dis[now]+1+(w[now]!=w[to]));
dfs2(to,now);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
cin>>n;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
add(u,v),add(v,u);
}
dfs1(1,0,1);
dfs2(1,0);int ans=n;
for(int i=1;i<=n;i++) ans=min(ans,max(dp[i][0].se-dis[i]+1,mx[i]));
cout<<ans;
return 0;
}