tarjan但0pt(恼火)(蠕动)(大叫)
查看原帖
tarjan但0pt(恼火)(蠕动)(大叫)
326254
LonginusMonkey楼主2023/7/21 15:56
5 7
4 2
5 4
4 2
3 2
1 2
1 1
2 1
3
1 3
1 5
3 1 2 4

#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int> vec[500100];
vector<int> ans[500100];
bool vis[500100];
int sum = 0;
int low[500100], dfn[500100], ti = 0;
void dfs(int index, int back) {
	low[index] = dfn[index] = ++ti;
	for(int i=0; i<vec[index].size(); ++i) {
		if(vec[index][i] == back) continue;
		if(low[vec[index][i]]!=0) {
			low[index] = min(low[index], low[vec[index][i]]);
			continue;
		}
		dfs(vec[index][i], index);
		low[index] = min(low[index], low[vec[index][i]]);
	}
}
signed main() {
	ios::sync_with_stdio(0); cin.tie(0); 
	int n, m; cin >> n >> m;
	for(int i=1; i<=m; ++i) {
		int u, v; cin >> u >> v;
		vec[u].push_back(v), vec[v].push_back(u);
	}
	for(int i=1; i<=n; ++i) {
		if(!low[i]) {
			dfs(i, 0);
		}
	}
	for(int i=1; i<=n; ++i) {
		if(!vis[i]) {
			vis[i] = 1;
			sum++;
			ans[low[i]].push_back(i);
		}
	}
	cout << sum << endl;
	for(int i=1; i<=n; ++i) {
		if(ans[i].size() == 0) continue;
		cout << ans[i].size() << " ";
		for(int j=0; j<ans[i].size(); ++j) {
			cout << ans[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

代码如上

2023/7/21 15:56
加载中...