import java.util.*;
class TreeDP {
static List<Integer>[] G;
static int[] nodeValue, parent, dp;
public static void dfs(int node, int par) {
//1. dfs deeply
parent[node] = par;
for (int child : G[node]) {
if (child != par) {
dfs(child, node);
}
}
// 2. take current number of buses so far as the buses that kids have
// multiple children means those subtrees kids
// we can have multiple leaves
for (int u : G[node]) {
if (u != parent[node]) {
dp[node] += dp[u];
}
}
// basically this condition makes sure this node is a leaf
// we have previously marked for parent .. but if its a leaf node the dp[node]
// would still be empty. Instead of checking for leaf node or not we can just mark
// dp of the parent as 2. this below cond would only happen for leaves
if (dp[node] == 0 && nodeValue[node] == 1) {
dp[node] = 1;
}
}
public static void main
(String[] args
) { Scanner sc
= new Scanner
(System.
in); int N = sc.nextInt();
nodeValue = new int[N + 1];
parent = new int[N + 1];
dp = new int[N + 1];
for (int i = 1; i <= N; i++) {
G[i] = new ArrayList<>();
nodeValue[i] = sc.nextInt();
}
for (int i = 1; i < N; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
G[u].add(v);
G[v].add(u);
}
dfs(1, -1); // Start DFS from root node 1
System.
out.
println(dp
[1]); // Output the minimum number of buses needed sc.close();
}
}
aW1wb3J0IGphdmEudXRpbC4qOwpjbGFzcyBUcmVlRFAgewogICAgc3RhdGljIExpc3Q8SW50ZWdlcj5bXSBHOwogICAgc3RhdGljIGludFtdIG5vZGVWYWx1ZSwgcGFyZW50LCBkcDsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGZzKGludCBub2RlLCBpbnQgcGFyKSB7CiAgICAgICAgLy8xLiBkZnMgZGVlcGx5CiAgICAgICAgcGFyZW50W25vZGVdID0gcGFyOwogICAgICAgIGZvciAoaW50IGNoaWxkIDogR1tub2RlXSkgewogICAgICAgICAgICBpZiAoY2hpbGQgIT0gcGFyKSB7CiAgICAgICAgICAgICAgICBkZnMoY2hpbGQsIG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIDIuIHRha2UgY3VycmVudCBudW1iZXIgb2YgYnVzZXMgc28gZmFyIGFzIHRoZSBidXNlcyB0aGF0IGtpZHMgaGF2ZSAKICAgICAgICAvLyBtdWx0aXBsZSBjaGlsZHJlbiBtZWFucyB0aG9zZSBzdWJ0cmVlcyBraWRzCiAgICAgICAgLy8gd2UgY2FuIGhhdmUgbXVsdGlwbGUgbGVhdmVzCiAgICAgICAgZm9yIChpbnQgdSA6IEdbbm9kZV0pIHsKICAgICAgICAgICAgaWYgKHUgIT0gcGFyZW50W25vZGVdKSB7CiAgICAgICAgICAgICAgICBkcFtub2RlXSArPSBkcFt1XTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gYmFzaWNhbGx5IHRoaXMgY29uZGl0aW9uIG1ha2VzIHN1cmUgdGhpcyBub2RlIGlzIGEgbGVhZgogICAgICAgIC8vIHdlIGhhdmUgcHJldmlvdXNseSBtYXJrZWQgZm9yIHBhcmVudCAuLiBidXQgaWYgaXRzIGEgbGVhZiBub2RlIHRoZSBkcFtub2RlXSAKICAgICAgICAvLyB3b3VsZCBzdGlsbCBiZSBlbXB0eS4gSW5zdGVhZCBvZiBjaGVja2luZyBmb3IgbGVhZiBub2RlIG9yIG5vdCB3ZSBjYW4ganVzdCBtYXJrCiAgICAgICAgLy8gZHAgb2YgdGhlIHBhcmVudCBhcyAyLiB0aGlzIGJlbG93IGNvbmQgd291bGQgb25seSBoYXBwZW4gZm9yIGxlYXZlcwogICAgICAgIGlmIChkcFtub2RlXSA9PSAwICYmIG5vZGVWYWx1ZVtub2RlXSA9PSAxKSB7CiAgICAgICAgICAgIGRwW25vZGVdID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFNjYW5uZXIgc2MgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwogICAgICAgIGludCBOID0gc2MubmV4dEludCgpOwoKICAgICAgICBHID0gbmV3IEFycmF5TGlzdFtOICsgMV07CiAgICAgICAgbm9kZVZhbHVlID0gbmV3IGludFtOICsgMV07CiAgICAgICAgcGFyZW50ID0gbmV3IGludFtOICsgMV07CiAgICAgICAgZHAgPSBuZXcgaW50W04gKyAxXTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CiAgICAgICAgICAgIEdbaV0gPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgbm9kZVZhbHVlW2ldID0gc2MubmV4dEludCgpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgaW50IHUgPSBzYy5uZXh0SW50KCk7CiAgICAgICAgICAgIGludCB2ID0gc2MubmV4dEludCgpOwogICAgICAgICAgICBHW3VdLmFkZCh2KTsKICAgICAgICAgICAgR1t2XS5hZGQodSk7CiAgICAgICAgfQoKICAgICAgICBkZnMoMSwgLTEpOyAvLyBTdGFydCBERlMgZnJvbSByb290IG5vZGUgMQoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZHBbMV0pOyAvLyBPdXRwdXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ1c2VzIG5lZWRlZAogICAgICAgIHNjLmNsb3NlKCk7CiAgICB9Cn0K