tarjan 0 pts 求调
查看原帖
tarjan 0 pts 求调
688783
SilverLi楼主2023/5/31 20:43
#include <bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n,m;
int cxt,h[N];
struct node {int v,nxt;}a[N];
inline void add(int u,int v) {
	a[++cxt].v=v,
	a[cxt].nxt=h[u],
	h[u]=cxt;
}
int t[N];
int cnt,dfn[N],low[N];
void tarjan(int u,int fa) {
	dfn[u]=++cnt,low[u]=cnt;
	for(int l=h[u];l;l=a[l].nxt) {
		int i=a[l].v;
		if(!dfn[u]) {
			tarjan(i,u);
			low[u]=min(low[u],low[i]);
			if(dfn[u]<low[i])   t[l]=t[l^1]=1;
		}
		else if(i!=fa)   low[u]=min(low[u],dfn[i]);
	}
}
int anss,vis[N];
vector<int> ans[N];
void dfs(int u) {
	vis[u]=1;
	ans[anss].push_back(u);
	for(int l=h[u];l;l=a[l].nxt) {
		int i=a[l].v;
		if(!vis[i]&&!t[i])	dfs(i);
	}
}
signed main() {
	cin>>n>>m;
	for(int i=1;i<=n;++i) {
		int u,v;
		cin>>u>>v;
		if(u==v)    continue;
		add(u,v),add(v,u);
	}
	for(int i=1;i<=n;++i)
		if(!dfn[i]) tarjan(i,0);
	for(int i=1;i<=n;++i)
		if(!vis[i])	++anss,dfs(i);
	cout<<anss<<'\n';
	for(int i=1;i<=anss;++i) {
		cout<<ans[i].size()<<' ';
		for(int j:ans[i])   cout<<j<<' ';
		cout<<'\n';
	}
	return 0;
}

2023/5/31 20:43
加载中...