RCO アルゴリズムイントロダクション輪読会 26. 最大フロー 1
フローネットワーク
各辺 が、容量
を持つ有向グラフである。入り口 s と出口 t が設定されている。
非負の値を取る量 を頂点 u から頂点 v へのフローと呼ぶ。
フローは以下の 2 条件を満たす。
- 容量制限: 全ての
に対して、
でなければならない。
- フロー保存則: 全ての
に対して、
でなければならない。
- 頂点 u に入ってくるフローと、頂点 u から出ていくフローの量が等しい。
最大フロー問題は s から t への最大の値を持つフローを求める問題である。
逆平行辺
逆平行辺を持つネットワークは簡単に逆平行辺を持たないグラフに構成し直すことが出来るので、議論を簡明にするため逆平行辺を禁止することにする。
複数の入口と出口
複数の入口があっても超入口を作ってそこから各入口に容量無限の辺を張れば、入口 1 つのネットワークとして扱える。出口についても同様。
練習問題
1-1.
フローネットワーク G の辺 (u, v) を分割し、新しい頂点 x を導入して (u, x) と (x, v) に置き換え、c(u, x) = c(x, v) = c(u, v) と定義した G' を考える。G' の最大フローが G の最大フローと同じ値を持つことを示せ。
であるため、G の最大フローの値
は辺を分割しても変わらないため。
1-2.
複数の入口や出口を持つフローネットワークの任意のフローは、超入口や超出口を追加して出来る単一の入口や出口を持つネットワークと同一であることを示せ。
超入口から張られる辺の容量は無限なので、流したいだけ流すことが出来る。そのため、超入口を与える前のグラフに比べて辺のフローは影響を受けない。
1-3.
となる道が存在しないような頂点 u が存在するとき、全ての頂点
について
を満たす最大フロー f が存在することを示せ。
Ford-Fulkerson 法
Ford-Fulkerson-Method(G, s, t) フロー f を 0 に初期化する while 増加可能経路 p が残余ネットワークに Gf に存在する フロー f を p に沿って増やす return f
残余ネットワーク
辺 (u, v) に追加でどのくらいフローを流すことが出来るかを残余容量 で表す。
にフローが f(v, u) 流れているとき、フローを削減できることを表現するため、
と表せる。
これをまとめると、
増加
f(u,v) 流れているフローを変化させることを考える。f を G におけるフロー、f' を残余容量からなる残余ネットワーク のフローとすると、変化後のフローは以下のように表される。
補題 26.1
を示せ
まず、容量制限を満たすことを示す。
http://www.cs.dartmouth.edu/~thc/clrs-bugs/pages/pp-718-720.pdf
全ての について以下の式が成り立つことを示す。
u から出る辺のもう一方の端点の集合をと表す。
また、u へ向かう辺のもう一方の端点の集合をと表す。
G には逆平行辺を含まれないので、
増加可能経路
残余ネットワーク 上での s から t への経路。
増加可能経路 p の各辺に沿って増やすことの出来るフローの最大値を p の残余容量とし、以下のように定義する。
フローネットワークのカット
V を と
を満たす S と T=V-S に分割する。これをカット (S, T) とする。
カット(S,T) と交差する純フローを
と定義する。
カットの容量はである。
最小カットは、カット(S, T)の中で、容量が最小のカットである。
系 26.5
G の任意のフロー f の値は G の任意のカット容量によって上から抑えられる。
証明
定理 26.6 最大フロー最小カットの定理
- fはGの最大フローである。
- 残余ネットワーク Gf は増加可能経路を含まない。
- Gのあるカット(S,T)に対して|f|=c(S,T) である。
証明
最大フローであるにも関わらず増加可能経路を持つと仮定すると、 が定まり、|f| より値が大きいGのフローが得られるので矛盾する。
Gf が増加可能経路を持たないとき、Gfにはsからtへの道が存在しない。
と定義する。
明らかにであり、
にはsからtへの道が存在しないので
である。よって、この分割(S,T)はカットである。
かつ
かつ
であるようなu, v を考える。
ならば
であり、
となり矛盾する。よって
である。
ならば
で
だから
となり矛盾する。よって
全てのカット(S, T) に対してである。よって
はfが最大フローであるための十分条件である。
Ford-Fulkersonのアルゴリズム
Ford-Fulkerson(G, s, t) for (u, v) in G.E (u, v).f = 0 while 残余ネットワーク G_f に s から t への道 p が存在する c_f(p) = min([c_f(u, v) for (u, v) in p]) for (u, v) in p if (u, v) in G.E (u, v).f = (u, v).f + c_f(p) else (v, u).f = (v, u).f - c_f(p)
つづく
続きは来週やります。