Advertisement
Yakov

Park.2018.Spring.DSU

May 26th, 2018
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.90 KB | None | 0 0
  1.  
  2. #include <vector>
  3.  
  4. class DisjointSetUnion {
  5. public:
  6.     DisjointSetUnion(int count);
  7.  
  8.     //void Set(int v);
  9.     int Find(int v);
  10.     void Union(int set_id1, int set_id2);
  11.  
  12. private:
  13.     std::vector<int> parent;
  14.     std::vector<int> rank;
  15. };
  16.  
  17. DisjointSetUnion::DisjointSetUnion(int count)
  18.     : parent(count, 0), rank( count, 1 )
  19. {
  20.     for (int i = 0; i < parent.size(); i++) {
  21.         parent[i] = i;
  22.     }
  23. }
  24.  
  25. int DisjointSetUnion::Find(int v)
  26. {
  27.     if (v == parent[v]) {
  28.         return v;
  29.     }
  30.  
  31.     return parent[v] = Find(parent[v]);
  32. }
  33.  
  34. void DisjointSetUnion::Union(int v, int u)
  35. {
  36.     const int parent_v = Find(v);
  37.     const int parent_u = Find(u);
  38.  
  39.     if (parent_u == parent_v) {
  40.         return;
  41.     }
  42.  
  43.     if (rank[parent_v] < rank[parent_u]) {
  44.         parent[parent_v] = parent_u;
  45.     }
  46.     else if (rank[parent_v] > rank[parent_u]) {
  47.         parent[parent_u] = parent_v;
  48.     }
  49.     else {
  50.         parent[parent_u] = parent_v;
  51.         rank[parent_v]++;
  52.     }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement