Tarjan写的没问题,SCC已经求出,问一下按最后节点编号大小输出怎么实现
查看原帖
Tarjan写的没问题,SCC已经求出,问一下按最后节点编号大小输出怎么实现
723205
xjsmsms楼主2023/12/5 16:53

玄关

#include <bits/stdc++.h>
#include <stack>
#include <vector>
using namespace std;
int n,m,cnt,cntb;
vector<int> edge[100010],belong[100010];
bool instack[100010];
int dfn[100010],low[100010];
stack<int> s;

void Tarjan(int u){
	++cnt;
	dfn[u]=low[u]=cnt;
	s.push(u);
	instack[u]=true; 
	for(int i=0;i<edge[u].size();++i){
		int v=edge[u][i];
		if(!dfn[v]){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(instack[v])
			low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		++cntb;
		int node;
		do{
			node=s.top();
			s.pop();
			instack[node]=false;
			belong[cntb].push_back(node);
		}while(node!=u);
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		int u,v;
		cin>>u>>v;
		edge[u].push_back(v);
	}
	Tarjan(1);
	cout<<cntb<<endl;
	for(int i=1;i<=cntb;++i){
		for(int j=0;j<belong[i].size();++j)
			cout<<belong[i][j]<<" ";
		cout<<endl;
	}
	
	return 0;
}
2023/12/5 16:53
加载中...