Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- class DSU {
- private:
- vector<int> parent;
- vector<int> rank;
- public:
- DSU(int n) {
- parent.resize(n + 1);
- rank.resize(n + 1, 1);
- for (int i = 0; i <= n; ++i) {
- parent[i] = i;
- }
- }
- int find(int x) {
- if (parent[x] != x) {
- parent[x] = find(parent[x]);
- }
- return parent[x];
- }
- void unite(int x, int y) {
- int rootX = find(x);
- int rootY = find(y);
- if (rootX != rootY) {
- if (rank[rootX] > rank[rootY]) {
- parent[rootY] = rootX;
- } else if (rank[rootX] < rank[rootY]) {
- parent[rootX] = rootY;
- } else {
- parent[rootY] = rootX;
- rank[rootX]++;
- }
- }
- }
- };
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int N, M;
- cin >> N >> M;
- DSU dsu(N);
- for (int i = 0; i < M; ++i) {
- int u, v;
- cin >> u >> v;
- dsu.unite(u, v);
- }
- vector<vector<int>> groups(N + 1);
- for (int i = 1; i <= N; ++i) {
- int root = dsu.find(i);
- groups[root].push_back(i);
- }
- vector<vector<int>> uniqueGroups;
- vector<bool> visited(N + 1, false);
- for (int i = 1; i <= N; ++i) {
- int root = dsu.find(i);
- if (!visited[root]) {
- uniqueGroups.push_back(groups[root]);
- visited[root] = true;
- }
- }
- cout << uniqueGroups.size() << endl;
- for (const auto& group : uniqueGroups) {
- cout << group.size() << endl;
- for (int student : group) {
- cout << student << " ";
- }
- cout << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement