拓扑。队列遍历
大佬们看一下那里RE就行啦,谢
#include <iostream>
#include <queue>
using namespace std;
const int N = 1e5 + 10;
int n, head[N], cnt, jin[N], a[N];
queue<int> q;
struct node {
int v, next;
} edge[N];
void add(int u, int v) {
edge[cnt ++].v = v;
edge[cnt].next = head[u];
head[u] = cnt;
jin[u] ++;
jin[v] ++;
}
int xuan() {
while (!q.empty()) {
int num = q.front();
q.pop();
if (!a[num]) {
return num;
}
}
return -1;
}
void dfs(int u) {
a[u] = 1;
for (int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].v;
jin[v] --;
if (jin[v] <= 1 && !a[v]) q.push(v);
}
int d = q.front();
q.pop();
dfs(d);
}
int main() {
scanf("%d", &n);
for (int i = 0; i <= n; i ++) edge[i].next = -1;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i < n; i++) {
int x, y;
scanf("%d%d", &x, &y);
add(x, y);
}
for (int i = 1; i <= n; i++) {
if (jin[i] <= 1) q.push(i);
}
int d = xuan();
dfs(d);
int sum = 0;
for (int i = 1; i <= n; i++) {
if (!a[i]) {
sum ++;
}
}
cout << sum;
return 0;
}