tarjan板子求调(玄关)
  • 板块灌水区
  • 楼主imFound
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/25 20:59
  • 上次更新2024/10/25 21:00:26
查看原帖
tarjan板子求调(玄关)
649797
imFound楼主2024/10/25 20:59

不用排序

#include<bits/stdc++.h>
using namespace std;
vector<int>scc[10005];
stack<int>a;
bool ins[100005];
int dfn[100005],low[100005],cnt,cnt1,tot,head[100005];
struct node{
	int to,next;
}e[100005];
void add(int u,int v){
	cnt1++;
	e[cnt1].to=v;
	e[cnt1].next=head[u];
	head[u]=cnt1;
}
void tarjan(int u){
	cnt++;
	dfn[u]=low[u]=cnt;
	a.push(u);
	ins[u]=1;
	for(int i=head[u];i;i=e[u].next){
		int to=e[i].to;
		if(!dfn[to]){
		tarjan(to);
		low[u]=min(low[u],low[to]);
		}else if(ins[to]){
			low[u]=min(low[u],dfn[to]);
		}
	}
	if(dfn[u]==low[u]){
		tot++;
		int node;
		do{
			node=a.top();
			a.pop();
			ins[node]=0;
			scc[tot].push_back(node);
		}while(node!=u);
	}
}
int n,m;
int u1,v1;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u1>>v1;
		add(u1,v1);
	}
	tarjan(1);
	for(int i=1;i<=tot;i++){
		for(int j=0;j<scc[i].size();j++){
			cout<<scc[i][j]<<" ";
		}
		cout<<endl;
	}
}
2024/10/25 20:59
加载中...