这T了是没写快读吗?
查看原帖
这T了是没写快读吗?
513326
阿哲朗读楼主2022/2/11 15:39
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,p,head[10050],dfn[10050],low[10050],ins[10050],s[10050];
int col,nu[10050],cd[10050],c[10050];
struct Edge
{
	int to,next,from;
}a[50050];

void AddEdge(int h,int t)
{
	a[++cnt].to=t;
	a[cnt].next=head[h];
	head[h]=cnt;
	a[cnt].from=h;
}

void Tarjan(int u)
{
	dfn[u]=low[u]=++cnt;
	ins[u]=1;
	s[++p]=u;
	for(int i=head[u];i;i=a[i].next)
	{
		int v=a[i].to;
		if(!dfn[v])
		{
			Tarjan(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 f;
		col++;
		do
		{
			f=s[p];
			p--;
			c[f]=col;
			nu[col]++;
			ins[f]=0;
		}while(f!=u);
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		AddEdge(x,y);
	}
	int number=cnt;
	cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i]) Tarjan(i);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=head[i];j;j=a[i].next)
		{
			if(c[i]==c[j]) continue;
			cd[c[i]]++;
		}
	} 
	int tt=0;
	for(int i=1;i<=col;i++)
	{
		if(!cd[i])
		{
			if(tt)
			{
				cout<<0;
				return 0;
			}
			tt=i;
		}
	}
	cout<<nu[tt];
	return 0;
}
2022/2/11 15:39
加载中...