RCO アルゴリズムイントロダクション輪読会 26. 最大フロー 3
プッシュ再ラベルアルゴリズム
今までは頂点にフローを溜め込むことができない条件のみを考えてきた。
頂点 u に流入するフローと頂点 u から流出するフローの合計が等しかった。
これを緩和して、流入量が流出量を超えることが出来るものとする。
このような条件でのフローをプリフローと呼ぶ。
この過剰量を e(u) とする。
について、
となるような頂点
をオーバーフロー頂点と呼ぶ。
高さ関数
であり、残余辺
について、
が成り立つような高さ関数 h を考える。
プッシュ操作
以下の条件を満たす残余辺 (u, v) について、u から v にフローをプッシュする。
Push(u, v) # 適用条件: u がオーバーフロー頂点で、c_f(u, v) > 0 かつ h(u) = h(v) + 1 df = min(e(u), c_f(u, v)) if (u, v) in E (u, v).f = (u, v).f + df else (v, u).f = (v, u).f - df e(u) -= df e(v) += df
プッシュ後に となるようなプッシュを飽和プッシュと呼ぶ。
再ラベル操作
かつ
の全ての v について
であるとき、u の高さを上げる。
Relabel(u) # 適用条件: u がオーバーフロー頂点、かつ、h(u) <= h(v) h(u) = 1 + min([h(v) for (u, v) in E_f])
基礎アルゴリズム
Initialize-Preflow(G, s) for v in V h(v) = 0 e(v) = 0 for (u, v) in E (u, v).f = 0 h(s) = |V| for v in G[s] (s, v).f = c(s, v) e(v) = c(s,v) e(s) -= c(s, v)
これによって s から出る全ての辺に容量上限までフローを流す。
つまり、s から出る辺は残余グラフに含まれなくなる。
よって全ての残余辺 について
が成り立つ。
(全てのについて
だから)
Generic-Push-Relabel(G)
Initialize-Preflow(G, s)
while 適用可能な push か relabel がある
適用可能な push か relabel を選び、実行する
補題 26.14
u がオーバーフロー頂点であれば、push か relabel が実行可能である。
証明
u から push が実行可能でない場合、全ての残余辺 について、
である。
このとき、 であり、relabel が実行可能である。
補題26.15
Generic-Push-Relabel の実行中、h(u) は減少しない。
証明
h(u) は relabel 以外では変化せず、relabel では適用のたびに必ず 1 以上増える。
補題26.16
Generic-Push-Relabel は h を高さ関数として維持する。
証明
初期状態では h が高さ関数制約を満たしている。
u から出る辺 (u, v) を考える。
Relabel(u) を行った後は が保証される。
u に入る辺 (w, u) を考える。
Relabel(u) の前に が成立していたならば、操作後は
が成立する。
よって Relabel(u) は高さ制約を維持する。
Push(u, v) を実行することを考える。
Push(u, v) によって が減少するとき、
が増加する。
これは に (v, u) が加わると考えられる。
このとき だから
である。
新しい残余辺 (v, u) について が成り立つ。
Push(u, v) によって が減少するとき、
から (u, v) が取り除かれると考える。
このときは、制約が取り除かれるので、再び h は高さ関数である。
補題26.17
f をプリフローとする。このとき残余グラフ には s から t への道はない。
証明
矛盾を導くために における s から t への道
が存在すると仮定する。
である。
一般性を失うことなく と仮定する。
に対して
である。
に対して
である。
よって である。
ここでだから
となり、高さ関数制約
に矛盾する。
補題26.18
Generic-Push-Relabel を実行して停止したとき、プリフロー f は最大フローである。
Push-Relabel の解析
補題 26.19
f をプリフローとする。この時、残余ネットワークの任意のオーバーフロー頂点 u から s への単純道が存在する。
証明
オーバーフロー頂点 x について、とする。
s が U に含まれることを示す。
矛盾を導くためにを仮定する。
とする。
より、
かつ、s以外のすべての頂点が非負の過剰を持ち、
だから、
である。
したがって
フローは非負だから
よってとなる
が存在する。
よって残余ネットワークには残余辺
が存在する。
よって道 が存在する。これは
となり矛盾。
補題 26.20
Generic-Push-Relabel 実行中はすべての頂点 u で が成り立つ。
証明
h(s)=|V|, h(t)=0 なので、 となる頂点 u について考える。
u から s への単純道 にを考える。ここでは
である。pは単純道なので
である。
だから
系 26.21
relabel の回数は頂点当たり高々回である。
証明
各頂点の高さ関数 h(u) は最大で 回上がる。はい。
補題 26.22
飽和プッシュ回数は回未満である。
証明
u から v への飽和プッシュが発生するとき、である。
同様に v から u への飽和プッシュが発生するとき、である。
つまり、u から v への飽和プッシュが起こった後、v から u への飽和プッシュが起こるまでに h(v) は少なくとも 2 増加する。
h(v) の最大値は 2|V|-1 なので、u と v の間に起こる飽和プッシュの回数は 2|V| 回未満であり、辺の本数を考えると全体で 2|V||E| 未満である。
補題 26.23
非飽和プッシュ回数は回である。
証明
ポテンシャル関数を定義する。
頂点 u の relabel によって は高々 2|V|-1 だけ増加する。
頂点 u からの飽和プッシュによって は高々 2|V|-1 だけ増加する。
頂点 u から v への非飽和プッシュを考える。
この操作により e(u)=0 となるので、h(u) は和の対象から外れ、 は正確に h(u) だけ減少する。
v がもともとオーバーフロー頂点だったとき、 の増加量は 0 である。
v が新たにオーバーフロー頂点となる場合、 は h(v) だけ増加する。
h(u)=h(v)+1 だから、 は少なくとも 1 減少する。
relabel 回数の上界が (2|V|-1)(|V|-2) 回、飽和プッシュ回数の上界が 2|V||E| 回、だから、relabel の上界を として、
の増加量の上界は
である。
は非飽和プッシュによって減少するので、非飽和プッシュ回数の上界は
である。