無向グラフに対して、
をならし $O(\alpha(n))$ 時間で処理することが出来ます。
また、内部的に各連結成分ごとに代表となる頂点を $1$ つ持っています。辺の追加により連結成分がマージされる時、新たな代表元は元の連結成分の代表元のうちどちらかになります。
dsu d(int n)
制約
計算量
int d.merge(int a, int b)
辺 $(a, b)$ を足します。
$a, b$ が連結だった場合はその代表元、非連結だった場合は新たな代表元を返します。
制約
計算量
bool d.same(int a, int b)
頂点 $a, b$ が連結かどうかを返します。
制約
計算量
int d.leader(int a)
頂点 $a$ の属する連結成分の代表元を返します。
制約
計算量
int d.size(int a)
頂点 $a$ の属する連結成分のサイズを返します。
制約
計算量
vector<vector<int>> d.groups()
グラフを連結成分に分け、その情報を返します。
返り値は「「一つの連結成分の頂点番号のリスト」のリスト」です。 (内側外側限らず)vector内でどの順番で頂点が格納されているかは未定義です。
計算量