#include <bits/stdc++.h>
using namespace std;
vector<int> a;
struct rerooting {
  struct data {
    int c, b;
    data(int c = 0, int b = 0) : c(c), b(b) {}
  };
  data merge(data l, data r) {
    l.c += r.c;
    l.b += r.b;
    return l;
  }
  data up(data x, int v) {
    if (a[v] == 1) x.c++;
    if (a[v] == 2) x.b++;
    return x;
  }
  int V;
  vector<vector<int> > adj;
  vector<vector<data> > dp;
  vector<data> ans;
  rerooting(int n) : V(n) {
    adj.assign(V, vector<int>());
    dp.assign(V, vector<data>());
    ans.assign(V, data());
  }
  void add_edge(int from, int to) {
    adj[from].push_back(to);
    adj[to].push_back(from);
  }
  data dfs(int v, int p) {
    data sub;
    int deg = adj[v].size();
    dp[v].assign(deg, data());
    for (int i = 0; i < deg; i++) {
      if (adj[v][i] == p) continue;
      dp[v][i] = dfs(adj[v][i], v);
      sub = merge(sub, dp[v][i]);
    }
    return up(sub, v);
  }
  void redfs(int v, int p, const data& psub) {
    int deg = adj[v].size();
    for (int i = 0; i < deg; i++)
      if (adj[v][i] == p) dp[v][i] = psub;
    vector<data> lft(deg, data()), rit(deg, data());
    for (int i = 1; i < deg; i++) lft[i] = merge(lft[i - 1], dp[v][i - 1]);
    for (int i = deg - 2; i >= 0; i--) rit[i] = merge(rit[i + 1], dp[v][i + 1]);
    for (int i = 0; i < deg; i++)
      if (adj[v][i] != p) redfs(adj[v][i], v, up(merge(lft[i], rit[i]), v));
    ans[v] = up(merge(dp[v][0], rit[0]), v);
  }
  void calc() {
    dfs(0, -1);
    redfs(0, -1, data());
  }
};
int main(void) {
  int n;
  cin >> n;
  a.assign(n, 0);
  for (int i = 0; i < n; i++) cin >> a[i];
  rerooting t(n);
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    t.add_edge(--u, --v);
  }
  t.calc();
  int red = 0, blue = 0, ans = 0;
  for (int i = 0; i < n; i++) {
    if (a[i] == 1) red++;
    if (a[i] == 2) blue++;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < t.adj[i].size(); j++) {
      if (t.dp[i][j].c == 0 && t.dp[i][j].b == blue) ans++;
      if (t.dp[i][j].c == red && t.dp[i][j].b == 0) ans++;
    }
  }
  cout << ans / 2 << endl;
}
