#include <bits/stdc++.h>

using namespace std;

vector<int> E[100010];
int w[100010];
int n;

int   up[100010][110];
int down[100010][110];

void dfs(int u, int fa)
{
	for (int i = 0; i <= 100; i++) {
		up[u][i] = n;
		down[u][i] = 0;
	}
	int sum = 1;	//up[u][w[u]]
	for (int &v : E[u]) {
		if (v == fa) continue;
		dfs(v, u);
		if (w[u]) {
			sum += down[v][w[u] - 1];
		}
		else {
			sum += up[v][0];
		}
		down[u][0] += up[v][0];
		for (int i = 1; i <= 100; i++) down[u][i] += down[v][i - 1]; 
	}
	for (int i = 0; i <= w[u]; i++) up[u][i] = min(up[u][i], sum);

	for (int &v : E[u]) {
		if (v == fa) continue;
		up[u][0] = min(up[u][0], up[v][1] + down[u][0] - up[v][0]);
		for (int i = 1; i < 100; i++) {
			up[u][i] = min(up[u][i], up[v][i + 1] + down[u][i] - down[v][i - 1]);
		}
	}
	for (int i = 100; i > 0; i--) up[u][i - 1] = min(up[u][i - 1], up[u][i]);
	down[u][0] = min(down[u][0], up[u][0]);
	for (int i = 0; i < 100; i++) down[u][i + 1] = min(down[u][i + 1], down[u][i]);
}

int main()
{
	while (scanf("%d", &n) != EOF) {
		for (int i = 1; i <= n; i++) {
			scanf("%d", w + i);
			E[i].clear();
		}
		for (int i = 1; i < n; i++) {
			int u, v;
			scanf("%d%d", &u, &v);
			E[u].push_back(v);
			E[v].push_back(u);
		}
		dfs(1, 0);
		int ans = n;
		for (int i = 0; i <= 100; i++) ans = min(ans, up[1][i]);
		printf("%d\n", ans);
	}
	return 0;
}
