無向グラフに対して,
- 辺の追加
- 2 頂点が連結かの判定
を
また、内部的に各連結成分ごとに代表となる頂点を 1 つ持っています。辺の追加により連結成分がマージされる時、新たな代表元は元の連結成分の代表元のうちどちらかになります。
public DSU(int n){-
$n$ 頂点$0$辺の無向グラフを作ります。
制約
頂点数
int merge(int a, int b)辺$(a,b)$を足します。
- 0 \leq a < n
- 0 \leq b < n
計算量
- ならし$O(α(n))$
boolean same(int a, int b){頂点$a,b$が連結かどうかを返します。
制約
- 0 \leq a < n
- 0 \leq b < n
計算量
- ならし$O(α(n))$
int leader(int a){頂点$a$の属する連結成分の代表元を返します。
制約
- 0 \leq a < n
計算量
- ならし$O(α(n))$
int size(int a) {頂点$a$の属する連結成分のサイズを返します。
制約
- 0 \leq a < n
計算量
- ならし$O(α(n))$
ArrayList<ArrayList<Integer>> groups(){グラフを連結成分に分け、その情報を返します。 返り値は「「一つの連結成分の頂点番号のリスト」のリスト」です。 (内側外側限らず)vector内でどの順番で頂点が格納されているかは未定義です。
計算量
$O(n)$