求捞。RE
查看原帖
求捞。RE
737273
digua2010楼主2024/9/1 21:19

拓扑。队列遍历

大佬们看一下那里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;
}
2024/9/1 21:19
加载中...