50分求调
  • 板块灌水区
  • 楼主cyz1234
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/2 19:56
  • 上次更新2024/12/2 22:03:17
查看原帖
50分求调
946931
cyz1234楼主2024/12/2 19:56

题目传送门

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e5 + 10, M = 2e6 + 10;
int head[N], dfn[N], low[N], num = 0, Stack[N], top = 0, s = 0;
int n, m;
vector<int>ans[N];
struct edge { 
	int to, ne;
} e[M << 1];
int cnt = 0;
void add(int u, int v) {
	e[++cnt].to = v;
	e[cnt].ne = head[u];
	head[u] = cnt;
}
void init() {
	memset(head, -1, sizeof head);
	memset(dfn, 0, sizeof dfn);
	memset(low, 0, sizeof low);
}
void tarjan(int u, int fa) {
	num++;
	dfn[u] = low[u] = num;
	Stack[top++] = u;
	for (int i = head[u]; i != -1; i = e[i].ne) {
		int v = e[i].to;
		if (v == fa) {
			continue;
		}
		if (!dfn[v]) {
			tarjan(v, u);
			low[u] = min(low[u], low[v]);
		} else {
			low[u] = min(low[u], dfn[v]);
		}
	}
	if (low[u] == dfn[u]) {
		s++;
		while (1) {
			int v = Stack[--top];
			ans[s].push_back(v);
			if (v == u)break;
		}
	}
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	int u, v;
	init();
	for (int i = 1; i <= m; i++) {
		cin >> u >> v;
		add(u, v);
		add(v, u);
	}
	for (int i = 1; i <= n; i++) {
		if (!dfn[i]) {
			tarjan(i, 0);
		}
	}
	cout << s << endl;
	for (int i = 1; i <= s; i++) {
		cout << ans[i].size();
		for (int j = 0; j < ans[i].size(); j++) {
			cout << " " << ans[i][j];
		}
		cout << endl;
	}
	return 0;
}
2024/12/2 19:56
加载中...