Alex_tz307

DSU GRAF BIPARTIT

May 1st, 2021 (edited)
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.85 KB | None | 0 0
  1. struct DSU {
  2.   vector<int> p, par, r;
  3.   /// par - paritatea distantei de la nod la lider
  4.   /// daca doua noduri au 'par' egal au aceeasi culoare
  5.   /// daca se adauga o muchie intre 2 noduri cu aceeasi culoare si acelasi lider, atunci se obtine un ciclu de lungime impara, iar graful nu mai este bipartit
  6.    
  7.   DSU(int N) {
  8.     p.resize(N + 1);
  9.     iota(p.begin(), p.end(), 0);
  10.     par.resize(N + 1);
  11.     r.assign(N + 1, 1);
  12.   }
  13.  
  14.   pair<int,int> get(int x) {
  15.     if (x == p[x])
  16.       return {x, 0};
  17.     pair<int,int> root = get(p[x]);
  18.     p[x] = root.first;
  19.     par[x] ^= root.second;
  20.     return {p[x], par[x]};
  21.   }
  22.  
  23.   void unite(int u, int v) {
  24.     pair<int,int> x = get(u), y = get(v);
  25.     if (r[x.first] > r[y.first])
  26.       swap(x, y);
  27.     p[x.first] = y.first;
  28.     par[x.first] = (x.second + y.second + 1) & 1;
  29.     r[y.first] += r[x.first];
  30.   }
  31. };
Advertisement
Add Comment
Please, Sign In to add comment