萌妹子刚学oi求助QwQ
查看原帖
萌妹子刚学oi求助QwQ
365551
Buckbeak楼主2021/10/16 18:41
#include<iostream>
#include<cstdio>
#define _ 0
using namespace std;
const int MAXN=1e4+5,MAXM=5e4+5;
int n,m,head[MAXN],cnt,ans;
int dfn[MAXN],low[MAXN],stak[MAXN],Time,pot,col[MAXN],tot,sum[MAXN];
bool cud[MAXN];
struct edge{int to,nxt;}e[MAXM];
inline void bild(int f,int t)
{
	e[++cnt].nxt=head[f],head[f]=cnt;
	e[cnt].to=t;
}
void Tarjan(int x)
{
	dfn[x]=low[x]=++Time,stak[++pot]=x;
	for(int i=head[x];i;i=e[i].nxt)
	{
		if(!dfn[e[i].to])
		{
			Tarjan(e[i].to);
			low[x]=min(low[x],low[e[i].to]);
		}
		else if(!col[e[i].to])
		low[x]=min(low[x],low[e[i].to]);
	}
	if(dfn[x]==low[x])
	{
		col[x]=++tot;
		++sum[tot];
		while(stak[pot]!=x)
		{
			col[stak[pot--]]=tot;
			++sum[tot];
		}
		--pot;
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,A,B;i<=m;++i)
	{
		scanf("%d%d",&A,&B);
		bild(A,B);
	}
	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=e[i].nxt)
		{
			if(col[i]!=col[e[j].to])
			{cud[col[i]]=1;break;}
		}
	}
	for(int i=1;i<=tot;++i)
	{
		if(!cud[i])
		{
			if(!ans) ans=sum[i];
			else {
				ans=0;break;
			}
		}
	}
	printf("%d",ans);
	return ~~(0^_^0);
}

10TLE 2WA 9AC

2021/10/16 18:41
加载中...