This documentation is automatically generated by online-judge-tools/verification-helper
#include "data_structure/union_find.hpp"
素集合データ構造
集合を扱うためのデータ構造.無向グラフに対して,辺の追加(union),2頂点が連結かの判定(find)が高速に行える.
UnionFind uf(int n)
bool uf.unite(int a, int b)
false
,非連結ならtrue
を返す.bool uf.same(int a, int b)
int uf.root(int a)
int uf.size(int a)
struct UnionFind {
public:
UnionFind(int n) : par(n, -1), rank(n, 0), siz(n, 1) {}
int root(int a) {
if(par[a] == -1) return a;
else return par[a] = root(par[a]);
}
bool same(int a, int b) {
return root(a) == root(b);
}
bool unite(int a, int b) {
int ra = root(a), rb = root(b);
if(ra == rb) return false;
if(rank[ra] < rank[rb]) swap(ra, rb);
par[rb] = ra;
if(rank[ra] == rank[rb]) rank[ra]++;
siz[ra] += siz[rb];
return true;
}
int size(int a) {
return siz[root(a)];
}
private:
vector<int> par, rank, siz;
};
#line 1 "data_structure/union_find.hpp"
struct UnionFind {
public:
UnionFind(int n) : par(n, -1), rank(n, 0), siz(n, 1) {}
int root(int a) {
if(par[a] == -1) return a;
else return par[a] = root(par[a]);
}
bool same(int a, int b) {
return root(a) == root(b);
}
bool unite(int a, int b) {
int ra = root(a), rb = root(b);
if(ra == rb) return false;
if(rank[ra] < rank[rb]) swap(ra, rb);
par[rb] = ra;
if(rank[ra] == rank[rb]) rank[ra]++;
siz[ra] += siz[rb];
return true;
}
int size(int a) {
return siz[root(a)];
}
private:
vector<int> par, rank, siz;
};