tarjan92求助
查看原帖
tarjan92求助
382274
暗影之梦楼主2021/11/19 21:55
#include<iostream> 
#include<queue>
using namespace std;
const int M=100005;
struct edge
{
	int to,nxt;
}e[M],e2[M];
int head[M],cnt1;
void edge(int u,int v)
{
	e[++cnt1].to=v;
	e[cnt1].nxt=head[u];
	head[u]=cnt1;
}
int c[M],dfn[M],low[M],s[M],d[M];
int cnt;
bool in[M];
int st[M],top,n2;
void tarjan(int u)
{
	dfn[u]=low[u]=++cnt;
	st[++top]=u;in[u]=1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(!dfn[v])
		{
			tarjan(v);low[u]=min(low[u],low[v]);
		}
		else if(in[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		++n2;
		do
		{
			in[st[top]]=0;
			c[st[top]]=n2;
			s[n2]++;
			top--;
		}while(st[top+1]!=u);
	}
}
int n,m,u,v,maxx=0,out[M];
queue<int>q;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		edge(u,v);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
	for(int u=1;u<=n;u++)
	{
		for(int i=head[u];i;i=e[i].nxt)
		{
			int v=e[i].to;
			if(c[u]!=c[v]) out[c[u]]++;
		}
	}
	int ans=0;
	for(int i=1;i<=n2;i++)
	{
		if(out[i]==0)
		{
            if(ans==1)
			{
            	ans=0;
            	break;
            }
		    ans=s[i];
        }
	}
	cout<<ans;
	return 0;
}
2021/11/19 21:55
加载中...