Nik_Perepelov

Доп контест 1 задача Соне

Nov 17th, 2021
947
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int parent[150000];
  6. int my_rank[150000];
  7. vector<int> kitty[150000];
  8.  
  9. void make_set (int v) {
  10.     parent[v] = v;
  11.     my_rank[v] = 0;
  12.     kitty[v].push_back(v);
  13. }
  14.  
  15. int find_set (int v) {
  16.     if (v == parent[v])
  17.         return v;
  18.     return find_set (parent[v]);
  19. }
  20.  
  21. void union_sets (int a, int b) {
  22.     a = find_set (a);
  23.     b = find_set (b);
  24.     if (a != b) {
  25.         if (my_rank[a] < my_rank[b])
  26.             swap (a, b);
  27.         parent[b] = a;
  28.         if (my_rank[a] == my_rank[b])
  29.             ++my_rank[a];
  30.         int old_size = kitty[a].size();
  31.         kitty[a].resize(kitty[a].size() + kitty[b].size());
  32.         for (int i = 0; i < kitty[b].size(); i++){
  33.             kitty[a][old_size + i] = kitty[b][i];
  34.         }
  35.         kitty[b].clear();
  36.     }
  37. }
  38.  
  39. void get_answer(){
  40.     int last_cage = find_set(0);
  41.     for (int i = 0; i < kitty[last_cage].size(); i++){
  42.         cout << kitty[last_cage][i] + 1 << ' ';
  43.     }
  44. }
  45.  
  46. int main(){
  47.     int n;
  48.     cin >> n;
  49.     for (int i = 0; i < n; i++)
  50.         make_set(i);
  51.     for (int i = 0; i < n; i++){
  52.         int a, b;
  53.         cin >> a >> b;
  54.         union_sets(a - 1, b - 1);
  55.     }
  56.     get_answer();
  57.  
  58. }
  59.  
Advertisement
Add Comment
Please, Sign In to add comment