强连通分量模板求调
  • 板块灌水区
  • 楼主Jerry_heng
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/7/26 21:26
  • 上次更新2023/11/3 07:29:11
查看原帖
强连通分量模板求调
763878
Jerry_heng楼主2023/7/26 21:26
#include<bits/stdc++.h>
using namespace std;
const int mx=1e4+10;
int cnt,c,n,m,s[mx],sum,tp,head[mx],low[mx],dfn[mx],be[mx];
bool co[mx],b[mx];
vector<int> ans[mx];
struct node{
	int to,nxt;
}edge[100001];
void add(int u,int v){
	edge[++cnt].to=v;
	edge[cnt].nxt=head[u];
	head[u]=cnt;
}
void dfs(int now){
	dfn[now]=low[now]=++cnt;
	s[++tp]=now,co[now]=1;
	for(int i=head[now];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(!dfn[v]){
			dfs(v);
			low[now]=min(low[now],low[v]);
		}
		else if(co[v]){
			low[now]=min(low[now],low[v]);
		}
	}
	if(dfn[now]==low[now]){
		sum++;
		while(s[tp]!=now){
			co[s[tp]]=0;
			be[s[tp]]=sum;
			ans[sum].push_back(s[tp]);
			tp--;
		}
		co[s[tp]]=0;
		be[s[tp]]=sum;
		ans[sum].push_back(s[tp]);
		tp--;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	cnt=0;
	for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);
	cout<<sum<<endl;
	for(int i=1;i<=sum;i++)
		sort(ans[i].begin(),ans[i].end());
	for(int i=1;i<=n;i++){
		if(b[be[i]])continue;
		b[be[i]]=1;
		for(int j=0;j<ans[be[i]].size();j++)
			cout<<ans[be[i]][j]<<" ";
		cout<<endl;
	}
	return 0;
}
2023/7/26 21:26
加载中...