76 pts 求调
查看原帖
76 pts 求调
1269111
Eden_star楼主2024/12/4 17:16
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,ans,cnt,sign;
int dfn[N],low[N],vis[N],scc[N],out_d[N],in_d[N];
int stk0[N],cn;
vector<int> pic[N],scc_[N];
queue<int> q;
void _set(){
	cn=0;
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	memset(vis,0,sizeof(vis));
	memset(scc,0,sizeof(scc));
	memset(out_d,0,sizeof(out_d));
}
void tarjan(int u);
int main(){
	_set();
	int u,v;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		pic[u].push_back(v);
	}
	for(int i=1;i<=n;i++){
		if(!vis[i])tarjan(i);
	}
	for(int i=1;i<=n;++i){
		for(int j=0;j<pic[i].size();++j){
			int v=pic[i][j];
			if(scc[i]!=scc[v]){
				out_d[scc[i]]++;
				in_d[scc[v]]++;
			}
		}
	}
	int t=0;
	for(int i=1;i<=cnt;++i){
		if(out_d[i]==0){
			if(t!=0) {
				cout<<0<<endl;
				return 0;
			}
			t=i;
		}
	}
	cout<<scc_[t].size()<<endl;
	return 0;
}
void tarjan(int u){
	int v;
	dfn[u]=low[u]=sign++;
	stk0[++cn]=u;
	vis[u]=1;
	for(int i=0;i<pic[u].size();i++){
		if(!dfn[pic[u][i]]){
			tarjan(pic[u][i]);
			low[u]=min(low[u],low[pic[u][i]]);
		}
		else if(vis[pic[u][i]]){
			low[u]=min(low[pic[u][i]],low[u]);
		}
	}
	if(low[u]==dfn[u]){
		cnt++;
		do{
			v=stk0[cn--];
//			vis[v]=0;
			scc_[cnt].push_back(v);
			scc[v]=cnt;
		}while(u!=v);
	}
}
2024/12/4 17:16
加载中...