Union-Find
グラフの連結成分を管理するデータ構造。
頂点がN個あったとき、以下の操作ができる、
merge(u,v):頂点uと頂点vをマージする(辺をつなぐ) 計算量:$ O(a(n))
same(u,v):頂点uと頂点vが同じ連結成分かを判定する。計算量:$ O(a(n))
size(u):頂点uが含まれる連結成分のサイズを判定する。計算量:$ O(a(n))
leader(u):頂点uが含まれる連結成分のリーダー(親)を取得する。
$ O(a(n))はとりあえずなんかめっちゃ速いとだけ思っておけば良い
説明を見てもよくわからないと思うので実際に使ってみよう。
code:cpp
using namespace atcoder;
int main(){
dsu uf(10);//大きさ10のUnionFindをつくる
uf.merge(0,1);//頂点0と頂点1を繋ぐ
if(uf.same(0,1)){
//頂点0と1が同じ連結成分なら
}
int u = uf.leader(1);//頂点1が含まれる連結成分の代表となる頂点
cout << uf.size(1) << endl;//頂点1が含まれる連結成分のサイズ
}