Advertisement
Tvor0zhok

Система непересекающихся множеств

Jul 22nd, 2021 (edited)
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.13 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <utility>
  5. #include <vector>
  6. #include <string>
  7. #include <cmath>
  8. #include <set>
  9. #include <map>
  10. using namespace std;
  11.  
  12. typedef long long ll;
  13. typedef pair <int, int> ii;
  14. typedef vector <int> vi;
  15. typedef vector <ii> vii;
  16.  
  17. class UnionFind
  18. {
  19. private: vi p, rank;
  20.  
  21. public:
  22.  
  23. vi setSize; int numSets;
  24.  
  25. UnionFind (int n)
  26. {
  27. rank.assign(n, 0); setSize.assign(n, 1); numSets = n;
  28.  
  29. for (int i = 0; i < n; ++i) p.push_back(i);
  30. }
  31.  
  32. int findSet (int i) { return (p[i] == i)? i : p[i] = findSet(p[i]); }
  33.  
  34. bool isSameSet (int i, int j) { return findSet(i) == findSet(j); }
  35.  
  36. void unionSet (int i, int j)
  37. {
  38. if (!isSameSet(i, j))
  39. {
  40. --numSets; int x = findSet(i), y = findSet(j);
  41.  
  42. if (rank[x] > rank[y])
  43. {
  44. p[y] = x; setSize[x] += setSize[y];
  45. }
  46. else
  47. {
  48. p[x] = y; setSize[y] += setSize[x];
  49.  
  50. if (rank[x] == rank[y]) ++rank[y];
  51. }
  52. }
  53. }
  54. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement