Advertisement
coloriot

HA32_Chats(13)

Nov 24th, 2024
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. class DSU {
  8. private:
  9.     vector<int> parent;
  10.     vector<int> rank;
  11.  
  12. public:
  13.     DSU(int n) {
  14.         parent.resize(n + 1);
  15.         rank.resize(n + 1, 1);
  16.         for (int i = 0; i <= n; ++i) {
  17.             parent[i] = i;
  18.         }
  19.     }
  20.  
  21.     int find(int x) {
  22.         if (parent[x] != x) {
  23.             parent[x] = find(parent[x]);
  24.         }
  25.         return parent[x];
  26.     }
  27.  
  28.     void unite(int x, int y) {
  29.         int rootX = find(x);
  30.         int rootY = find(y);
  31.         if (rootX != rootY) {
  32.             if (rank[rootX] > rank[rootY]) {
  33.                 parent[rootY] = rootX;
  34.             } else if (rank[rootX] < rank[rootY]) {
  35.                 parent[rootX] = rootY;
  36.             } else {
  37.                 parent[rootY] = rootX;
  38.                 rank[rootX]++;
  39.             }
  40.         }
  41.     }
  42. };
  43.  
  44. int main() {
  45.     ios::sync_with_stdio(false);
  46.     cin.tie(nullptr);
  47.  
  48.     int N, M;
  49.     cin >> N >> M;
  50.  
  51.     DSU dsu(N);
  52.  
  53.     for (int i = 0; i < M; ++i) {
  54.         int u, v;
  55.         cin >> u >> v;
  56.         dsu.unite(u, v);
  57.     }
  58.  
  59.     vector<vector<int>> groups(N + 1);
  60.     for (int i = 1; i <= N; ++i) {
  61.         int root = dsu.find(i);
  62.         groups[root].push_back(i);
  63.     }
  64.  
  65.     vector<vector<int>> uniqueGroups;
  66.     vector<bool> visited(N + 1, false);
  67.     for (int i = 1; i <= N; ++i) {
  68.         int root = dsu.find(i);
  69.         if (!visited[root]) {
  70.             uniqueGroups.push_back(groups[root]);
  71.             visited[root] = true;
  72.         }
  73.     }
  74.  
  75.     cout << uniqueGroups.size() << endl;
  76.  
  77.     for (const auto& group : uniqueGroups) {
  78.         cout << group.size() << endl;
  79.         for (int student : group) {
  80.             cout << student << " ";
  81.         }
  82.         cout << endl;
  83.     }
  84.  
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement