#include <bits/stdc++.h>
using namespace std;
long long int n, c[300010], i, x, y, r[300100], b[300100], ans, d[300100], rt,
    bt;
vector<long long int> adj[300100];
pair<long long int, long long int> dis[300100], ed[300100];
bool vis[300100];
queue<long long int> q;
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  rt = 0;
  bt = 0;
  for (i = 1; i < n + 1; i++) {
    cin >> c[i];
    if (c[i] == 1) rt++;
    if (c[i] == 2) bt++;
  }
  for (i = 1; i < n; i++) {
    cin >> x >> y;
    ed[i].first = x;
    ed[i].second = y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  for (i = 2; i < n + 1; i++) vis[i] = false;
  vis[1] = true;
  dis[1].first = n;
  q.push(1);
  d[1] = 0;
  while (!q.empty()) {
    x = q.front();
    q.pop();
    for (auto u : adj[x]) {
      if (vis[u]) continue;
      vis[u] = true;
      d[u] = x;
      dis[u].first = dis[x].first - 1;
      q.push(u);
    }
  }
  for (i = 1; i < n + 1; i++) dis[i].second = i;
  sort(dis + 1, dis + n + 1);
  for (i = 1; i < n + 1; i++) {
    if (c[i] == 0) r[i] = 0, b[i] = 0;
    if (c[i] == 1) r[i] = 1, b[i] = 0;
    if (c[i] == 2) r[i] = 0, b[i] = 1;
  }
  for (i = 1; i < n + 1; i++) {
    for (auto u : adj[dis[i].second])
      if (d[u] == dis[i].second)
        r[dis[i].second] = r[dis[i].second] + r[u],
        b[dis[i].second] = b[dis[i].second] + b[u];
  }
  ans = 0;
  for (i = 1; i < n; i++) {
    if (d[ed[i].first] != ed[i].second) swap(ed[i].first, ed[i].second);
    if ((r[ed[i].first] == rt && b[ed[i].first] == 0) ||
        (b[ed[i].first] == bt && r[ed[i].first] == 0))
      ans++;
  }
  cout << ans;
}
