28分代码求助
查看原帖
28分代码求助
133389
Lzf_Mannar楼主2020/7/28 10:51
#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
struct Edge{int from,to,next;};
Edge a[maxn*10+10];
int N,M;
int head[maxn*10+9000],nond,cnt[maxn],frn[maxn],stank[maxn],low[maxn],color[maxn],du[maxn],K,tot,ans;
bool jb[maxn];
void Tarjan(int bj){
	nond++;
	frn[bj]=low[bj]=nond;
	stank[++K]=bj;
	jb[bj]=true;
	for (int i=head[i];i;i=a[i].next){
		int x=a[i].to;
		if (!frn[x]){
			Tarjan(x);
			low[bj]=min(low[x],low[bj]);
		}
		else if (jb[x])	low[bj]=min(low[bj],frn[x]);
	}
	if (low[bj]==frn[bj]){
		tot++;
		do{
			color[stank[K]]=tot;
			cnt[tot]++;
			jb[stank[K]]=false;
			K--;
		}while(bj!=stank[K+1]);
	}
}
int main(){
	scanf ("%d%d",&N,&M);
	for (int i=1;i<=M;i++){
		scanf ("%d%d",&a[i].from,&a[i].to);
		a[i].next=head[a[i].from];
		head[a[i].from]=i;
	}
	for (int i=1;i<=N;i++)
		if (!frn[i])	Tarjan(i);
	for (int i=1;i<=N;i++)
		for (int j=head[i];j;j=a[j].next){
			if (color[a[j].to]!=color[i])
				du[color[i]]++;
		}
	for (int i=1;i<=tot;i++){
		if (!du[i]){
			if (ans){cout<<0;return 0;}
			ans=i;
		}
	}
	cout<<cnt[ans];
	return 0;
}
2020/7/28 10:51
加载中...