求助一下这个tarjan那里出问题了
查看原帖
求助一下这个tarjan那里出问题了
235901
Always_Remember_It楼主2024/6/29 09:22
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int n,m,head[N],tot;
int dfn[N],low[N],tim;
int sta[N],cnt,num[N];
int sum,in[N],r[N];
bool vis[N];
struct Edge{
	int next,from,to;
}e[N];
void adde(int u,int v){
	e[++tot].next=head[u];
	e[tot].from=u;
	e[tot].to=v;
	head[u]=tot;
	return;
}
void tarjan(int u){
	dfn[u]=low[u]==++tim;
	vis[u]=1;
	sta[++cnt]=u;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		++sum;
		while(1){
			int now=sta[cnt--];
			in[now]=sum;
			vis[now]=0;
			++num[sum]; 
			if(now==u) break;
		}
	}
	return;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;cin>>u>>v;
		adde(v,u);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) tarjan(i);
	}
	for(int i=1;i<=m;i++){
		int u=e[i].from,v=e[i].to;
		if(in[u]==in[v]) continue;
		++r[in[v]];
	}
	bool flag=0;
	int ans=0;
	for(int i=1;i<=sum;i++){
		if(!r[i]){
			if(flag){
				ans=0;
				break;
			}
			flag=1;
			ans=num[i];
		}
	}
	cout<<ans<<endl;
	return 0;
}
2024/6/29 09:22
加载中...