Advertisement
Nik_Perepelov

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

Nov 17th, 2021
1,169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int parent[150000];
  7. int my_rank[150000];
  8. int sets_quantity;
  9.  
  10. void make_set(int v) {
  11.     parent[v] = v;
  12.     my_rank[v] = 0;
  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.         sets_quantity -= 1;
  31.     }
  32. }
  33.  
  34. int main() {
  35.     int n;
  36.     cin >> n;
  37.     sets_quantity = n;
  38.     for (int i = 0; i < n; i++)
  39.         make_set(i);
  40.     for (int i = 0; i < n; i++){
  41.         int inp;
  42.         cin >> inp;
  43.         union_sets(i, inp - 1);
  44.     }
  45.     cout << sets_quantity;
  46. }
  47.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement