48分tarjan求条
查看原帖
48分tarjan求条
1048914
cgy20140502楼主2025/6/15 20:31
#include <bits/stdc++.h>
#define N 5e4+5
using namespace std;
vector <int> G[int(N)];
stack <int> stk;
int n,m,dfn[int(N)],siz[int(N)],sum,low[int(N)],col,scc[int(N)],cnt,idx,out[int(N)];bool ins[int(N)];
void trajan(int u){
	dfn[u] = low[u] = ++idx;
	stk.push(u);
	ins[u] = 1;
	for (int i = 0;i < G[u].size();i++){
		int v = G[u][i];
		if (!dfn[v]){
			trajan(v);
			low[u] = min(low[u],low[v]);
		}else if (ins[v]) low[u] = min(low[u],dfn[v]);
	}
	if (dfn[u] == low[u]){
		int v;col++;
		do{
			v = stk.top();
			scc[v] = col;
			ins[v] = 0;
			++siz[col];
			stk.pop();
		}while (u != v);
	}
}
signed main(){
	cin >> n >> m;
	int u,v;
	while (m--){
		cin >> u >> v;
		G[u].push_back(v);
	}
	for (int i = 1;i <= n;i++)
		if (!dfn[i]) trajan(i);
	for (int i = 1;i <= n;i++)
		for (int j = 0;j < G[i].size();j++)
			if (scc[i] != scc[j])
				out[scc[i]]++;
	for (int i = 1;i <= col;i++) if (!out[i]) sum = siz[i],cnt++;
	if (cnt > 1) sum = 0;
	cout << sum;
	return 0;
}
2025/6/15 20:31
加载中...