いろはすの競プロ反省会

主に反省してます。たまに役に立つことも書くかも?

Union-Find木を実装してみた

何番煎じか分からないけどやってみた。 (蟻本だとクラスや構造体にまとめてなくてとっ散らかってたため)

#include<bits/stdc++.h>

using namespace std;

struct union_find{
  vector<int> par;
  vector<int> rank;
  union_find(int n){
    rank = vector<int>(n,0);
    for(int i=0; i<n; i++){
      par.push_back(i);
    }
  }

  int root(int x){
    if(par[x]==x){
      return x;
    } else {
      return par[x] = root(par[x]);
    }
  }

  void unite(int x, int y){
    int rx = root(x);
    int ry = root(y);

    if(rx==ry)
      return;

    if(rank[rx]<rank[ry]){
      par[rx] = ry;
    } else {
      par[ry] = rx;
      if(rank[rx]==rank[ry])
        rank[rx]++;
    }
  }

  bool equiv(int x, int y){
    return root(x)==root(y);
  }
};

int main(){
  union_find uf(6);
  uf.unite(1,3);
  uf.unite(3,5);
  for(int i=1; i<6; i++){
    cout << uf.root(i) << endl;
  }
  cout<< uf.equiv(1,5) << endl;
  cout<< uf.equiv(1,2) << endl;

  return 0;
}