#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;
struct edge
{
int f,t,next;
}e[N*2];
int head[N],esum=0,leap=0,temporary_point[N],point[N];
struct Point
{
int lsum,maxx;
}P[N];
inline void init(int fr,int to)
{
e[++esum]={ fr,to,head[fr] };
head[fr]=esum;
}
void Dfs(int poin,int fa)
{
bool tf=1;
P[poin]={point[poin],0};
for(int i=head[poin];i;i=e[i].next)
{
int y=e[i].t;
if(y!=fa)
{
tf=0;
Dfs(y,poin);
P[poin].maxx+=P[y].maxx;
P[poin].lsum+=P[y].lsum;
}
}
if(tf) P[poin]={ point[poin],1 };
else P[poin]={ min(P[poin].lsum,P[poin].maxx) , P[poin].maxx };
}
void dfs_leaf_node(int poin,int fa)
{
bool tf=1;
for(int i=head[poin];i;i=e[i].next)
{
int y=e[i].t;
if(y!=fa)
{
tf=0;
dfs_leaf_node(y,poin);
}
}
if(tf) leap++;
}
int main()
{
memset(head,0,sizeof(head));
memset(point,0,sizeof(point));
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
int p;
for(int i=1;i<=n;i++)
{
cin>>p;
temporary_point[i]=p;
}
int u,v;
for(int i=1;i<n;i++)
{
cin>>u
>>v;
init(u,v);
init(v,u);
}
dfs_leaf_node(1,0);
for(int i=1;i<=leap;i++) point[temporary_point[i]]++;
Dfs(1,0);
cout<<P[1].lsum;
return 0;
}