WA48pts已判同强连通分量与tarjan回边
查看原帖
WA48pts已判同强连通分量与tarjan回边
267125
宋小陀螺楼主2024/6/22 21:26
#include<bits/stdc++.h> 
using namespace std;
const int N = 10005;
int n,m,cnt,dfn[N],low[N],tot,id[N],siz[N],od[N],od0,ansk;
bool ins[N];
vector<int> gra[N];
stack<int> stk;
void tarjan(int u) 
{
	low[u] = dfn[u] = ++cnt;
	ins[N] = true;
	stk.push(u);
	for (auto v: gra[u]) 
	{
		if (!dfn[v]) 
		{
			tarjan(v);
			low[u] = min(low[u],low[v]);
		}
		else if (ins[v]) low[u] = min(low[u],dfn[v]);
	}
	if (low[u] == dfn[u]) 
	{
		tot++;
		int k;
		do 
		{
			k = stk.top();
			id[k] = tot;
			ins[k] = false;
			siz[tot]++;
			stk.pop();
		}while (k != u);
	}
}
int main() 
{
	int a,b;
	cin >> n >> m;
	for (int i = 1;i <= m;i++) 
	{
		cin >> a >> b;
		gra[a].push_back(b);
	}
	for (int i = 1;i <= n;i++) 
		if (!dfn[i]) tarjan(i);
	for (int i = 1;i <= n;i++) 
		for (auto v: gra[i]) 
			if (id[v] != id[i]) od[id[i]]++;
	for (int i = 1;i <= tot;i++) 
		if (!od[i]) 
		{
			od0++;
			ansk = i;
		}
	if (od0 > 1) cout << 0 << endl;
	else cout << siz[ansk] << endl;
	return 0;
}
2024/6/22 21:26
加载中...