tarjan 48pts求助
查看原帖
tarjan 48pts求助
598875
nikodo楼主2024/11/20 22:39
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> v[10005],v1[10005];
int dfn[10005],low[10005],stk[10005],fa[10005];
int num[10005];
int x[50005],y[50005];
bool instk[10005],cnt[10005];
int deep,top;
void dfs(int o)
{
	dfn[o]=low[o]=++deep;
	stk[++top]=o;
	instk[o]=1;
	for(int i:v[o])
	{
		if(!dfn[i])
		{
			dfs(i);
			low[o]=min(low[o],low[i]);
		}
		else if(!instk[i])
		{
			low[o]=min(low[o],dfn[i]);
		}
	}
	if(dfn[o]==low[o])
	{
		while(stk[top]!=o)
		{
			instk[stk[top]]=0;
			fa[stk[top]]=o;
			top--;
		}
		fa[o]=o;
		top--; 
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x[i],&y[i]);
		v[x[i]].emplace_back(y[i]);
	}
	if(m<n-1)
	{
		printf("0\n");
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		if(!fa[i])
		{
			dfs(i);
		}
	}
	vector<int> q;
	for(int i=1;i<=n;i++)
	{
		if(fa[i]==i)
		{
			q.emplace_back(i);
		}
		num[fa[i]]++;
	}
	if(q.size()==1)
	{
		printf("%d",n);
		return 0;
	}
	for(int i=1;i<=m;i++)
	{
		if(fa[x[i]]!=fa[y[i]])
		{
			v1[fa[x[i]]].emplace_back(fa[y[i]]);
			cnt[fa[x[i]]]=1;
		}
	}
	int sum=0,ans1;
	for(int i:q)
	{
		if(!cnt[fa[i]])
		{
			sum++;
			ans1=num[fa[i]];
		}
	}
	if(sum>1)printf("0\n");
	else printf("%d",ans1);
	return 0;
}
2024/11/20 22:39
加载中...