algo — C++23 日本語リファレンス GitHub

BipartiteMatching

クラス · 二部グラフの最大マッチング(push-relabel 方式、$O(E\sqrt V)$)

struct BipartiteMatching;

概要

二部グラフの最大マッチング(push-relabel 方式、$O(E\sqrt V)$)

未マッチの右頂点が「レベル最小の左隣接頂点」を奪い、押し出された右頂点が 再びキューに戻る。左頂点のレベル(自由左頂点までの交互道長の下界)は 奪われるたびに $+2$ され(relabel)、$V$ 回のポップごとに BFS で全体を 張り直す(global relabel)。レベルが $V$ 以上に達した頂点は増強不能。 Goldberg–Kennedy の解析により $O(E\sqrt V)$。実測でも増強路ベースの Hopcroft-Karp より速い。

構築・破棄

名前 説明 計算量
(constructor) 左n頂点・右m頂点の空の二部グラフを構築する $O(n+m)$

メンバ関数

名前 説明 計算量
add_edge 左頂点uと右頂点vを結ぶ辺を追加する 償却 $O(1)$
matching 最大マッチングのサイズ 頂点数を $V$、辺数を $E$ として初回 $O(E\sqrt V)$
get_pairs 現在のマッチング辺を返す $O(V)$
minimum_vertex_cover 最小頂点被覆(König の定理) $O(E\sqrt V)$
maximum_independent_set 最大独立集合(最小頂点被覆の補集合) $O(E\sqrt V)$

メンバの詳細

matching

int matching();

最大マッチングのサイズ

minimum_vertex_cover

std::pair<std::vector<int>, std::vector<int>> minimum_vertex_cover();

最小頂点被覆(König の定理)

maximum_independent_set

std::pair<std::vector<int>, std::vector<int>> maximum_independent_set();

最大独立集合(最小頂点被覆の補集合)

参照