tarjan为啥T了18个点
查看原帖
tarjan为啥T了18个点
792297
doublebreathing楼主2023/7/6 20:15

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 100100, M = 500100;
struct node {
	int to, next;
} e[M];
int  h[N], idx, n, m;
int dfn[N], low[N], out[N], timetsma;
int stk[N], top;
void in(int &read) {
	int x = 0, f = 1;
	char ch;
	for (ch = getchar(); (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
	if (ch == '-') {
		f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + ch - '0';
		ch = getchar();
	}
	read = x * f;
}
bool st[1000001];
int id[N], cnt, s[N];
void add(int form, int to) {
	e[++idx].next = h[form], e[idx].to = to;
	h[form] = idx;
}
void tarjan(int u) {
	dfn[u] = low[u] = ++timetsma;
	stk[++top] = u, st[u] = 1;
	for (int i = h[u]; i; i = e[i].next) {
		int j = e[i].to;
		if (!dfn[j]) {
			tarjan(j);
			low[u] = min(low[u], low[j]);
		} else if (st[j]) {
			low[u] = min(low[u], dfn[j]);
		}
	}
	int y;
	if (dfn[u] == low[u]) {
		++cnt;
		do {
			y = stk[top--];
			st[y] = 0;
			id[y] = cnt;
			s[cnt]++;
		} while (y != u);
	}
}
int main() {
	in(n),in(m);
	while (m--) {
		int a, b;
		in(a),in(b);
		add(a, b);
	}
	for (int i = 1; i <= n; i++) {
		if (!dfn[i]) {
			tarjan(i);
		}
	}
	for (register int i = 1; i <= n; i++) {
		for (register int j = h[i]; j; j = e[i].next) {
			int k = e[j].to;
			int a = id[i], b = id[k];
			if (a != b) out[a]++;
		}
	}
	int k = 0;
	for (register int i = 1; i <= cnt; i++) {
		if (!out[i]) {
			if (k) {
				puts("0");
				return 0;
			}
			k = i;
		}
	}
	cout << s[k];
	return 0;
}
2023/7/6 20:15
加载中...