Advertisement
gerkulesov

Disjoint Set Union / DSU

Apr 19th, 2020
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.06 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void make_set(vector <int> &parent, vector <int> &power, int v) {
  6.     parent[v] = v;
  7.     power[v] = 1;
  8.     /// rank[v] = 1 /// for rank euristica
  9. }
  10.  
  11. int leader(vector <int> &parent, int v) {
  12.     if (parent[v] == v)
  13.         return v;
  14.     return parent[v] = leader(parent, parent[v]);
  15. }
  16.  
  17. /// euristica with sets' power
  18. void merge_set(vector <int> &parent, vector <int> &power, int a, int b) {
  19.     a = leader(parent, a);
  20.     b = leader(parent, b);
  21.  
  22.     if (a != b) {
  23.         if (power[a] < power[b])
  24.             swap(a, b);
  25.         parent[b] = a;
  26.         power[a] += power[b];
  27.         /// power[b] = 0;
  28.     }
  29. }
  30.  
  31. /// euristica with sets' rank
  32. void merge_set(vector <int> &parent, vector <int> &rank, int a, int b) {
  33.     a = leader(parent, a);
  34.     b = leader(parent, b);
  35.  
  36.     if (a != b) {
  37.         if (rank[a] < rank[b])
  38.             swap(a, b);
  39.         parent[b] = a;
  40.         if (rank[a] == rank[b])
  41.             rank[a]++;
  42.     }
  43. }
  44.  
  45. int main()
  46. {
  47.     cout << "Hello world!" << endl;
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement