ei1333's page

ホーム > Wiki

最大流(Dinic)

説明

最大流を求める。最短の増加パスを探して、そこにフローを流していくことを繰り返す。そのような経路がなくなったら残余パスでもう一度それを繰り返す。それでも、流せなくなったら終了する。実際の計算量よりも高速に動作することが知られている。

最大流は最小カットと一致する。

計算量

$O(E V^2)$

実装例

応用: 燃やす埋める

以下の制約問題は最小カットで解くことが出来る。

必ず $0$ に割り当てられる頂点 $S$, $1$ に割り当てられる頂点 $T$ がある。それぞれの制約 $(x_i, y_i, z_i)$ に対し, 「頂点 $x_i$ から頂点 $y_i$ に容量 $z_i$ の辺を張った」あと, 頂点 $S$ から頂点 $T$ への最小カットを求めると, 失う重みの和の最小値となっている。

以下のように色々な制約を $(x_i, y_i, z_i)$ の形に変形することができる。

但し以下の制約があるときは最大カットになるため NP-完全(らしい)。

参考 最小カットについて - よすぽの日記