Ford-Fulkerson
概要
- 各辺に容量を持ち、始点と終点のあるグラフが与えられたとき、始点から終点までの最大フローを求める
- 最大フロー最小カット定理により、グラフの最小カットを求めることとも同値
- グラフ中の辺 の容量が で、 から に だけフローが流れているとき、 に の有効辺を考える
- あとどれくらいフローを流せるかを意味するネットワークが構築できる
- 残余ネットワークなどと呼ばれる
- 残余ネットワークにおいて終点から始点へのパスを見つけ、そのパス上にフローを流すことを繰り返す
- このようなパスを増加パス(増加道)などと呼ぶ
- フローを流すたびに残余ネットワークを更新していく
- パスの探索に幅優先探索を用いる場合をEdmonds-Karpと呼ぶこともある
- 計算時間はグラフの辺の数を 、最大フローを として
- 1回の残余ネットワークの探索に 、1回パスを見つけるごとにフロー量は少なくとも1増加するので、繰り返しは最大でも 回
- 辺の容量が無理数の場合は停止性が保証されない
- Edmonds-Karpではグラフの頂点数を 、辺の数を として で、停止性が保証される
実装
InitGraph(N)
で 点の頂点集合を作り、AddEdge(u, v, c)
で頂点 から頂点 へ容量 の辺を作るFordFulkerson(s, t)
で から への最大フローを求める- 良い感じの例題を作るのが難しかったので、ライブラリ部分だけ記載
Python3で実装する
Powered by OnlineGDB