#include <iostream>
#include <queue>
using namespace std;
const int maxn = 2e5;
long long n,k,du[maxn + 5];
vector<int> G[maxn + 5];
bool vis[maxn + 5],vis2[maxn + 5];
queue<int> q;
void tuobu(){
for(int i = 1;i <= n; i++) if(du[i] == 1 && !vis[i]) q.push(i),vis2[i] = true;
while(!q.empty()){
int x = q.front();
q.pop();
for(auto v : G[x]){
// cout << x << ":" << v << endl;
du[v]--;
if(du[v] == 1 && !vis[v]) q.push(v),vis2[v] = true;
}
}
}
int main(){
cin >> n;
for(int i = 1;i <= n; i++){
int s;
cin >> s;
vis[i] = s;
}
for(int i = 1;i < n; i++){
int u,v;
cin >> u >> v;
du[u]++,du[v]++;
G[u].push_back(v),G[v].push_back(u);
}
// memset(vis,false,sizeof(vis));
tuobu();
int cnt = n;
for(int i = 1;i <= n; i++){
cnt -= (int)(vis2[i] || vis[i]);
// cout << vis2[i] << " " << vis[i] << endl;
}
cout << cnt << endl;
return 0;
}
/*
10
1 1 0 0 1 1 0 0 0 1
1 2
1 3
1 4
1 5
2 6
2 7
3 8
6 9
6 10
*/
# 42 混凝土 没过求条