# 最大流最小カット定理・Ford-Fulkerson法 (チラ裏) (wip) - アルゴリズムイントロダクション(赤)p308 - 蟻本 191p - https://ja.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E3%83%95%E3%83%AD%E3%83%BC%E6%9C%80%E5%B0%8F%E3%82%AB%E3%83%83%E3%83%88%E5%AE%9A%E7%90%86 主張: **ネットワークにおける最大流と最小カットは一致する** #### ネットワークってなんですか フローネットワーク$G = (V, E, s, t)$ - 有向グラフ$(V, E)$について、各辺$(u, v)\in E$が非負の容量$c(u, v)$を持つ - $(u, v)\in E\to (v, e)\notin E$ を満たす - 自己ループを持たない(容量は0) - $s\in V, t\in V$ #### フローってなんですか ネットワーク$G = (V, E, s, t)$に対するフロー$f$とは 1. 実数値関数$f: V\times V\to \mathbb{R}$である 2. 容量制限を満たす$\forall_{(u, v)\in E}\ 0\le f(u, v)\le c(u, v)$ 4. フロー保存則を満たす$\forall_{u\in V-\{s, t\}}\ \sum_{v\in V}f(v, u) = \sum_{v\in V} f(u, v)$ - 始点と終点以外の頂点について、入ってくる水の量とでていく水の量は一緒! フローの値$|f|$を$\sum_{v\in V} f(s, v) - \sum_{v\in V}f(v, s)$とする - 入口から入って入口に帰ってこなかった水の量 - 入口に帰ってきてしまった水以外は、出口から抜けている? 最大フローはこのフローの値が最大であるフローを発見せよという問題 #### カットってなんですか ネットワーク$(V, E, s, t)$のカット$(S, T)$とは、$V$を$S$と$T$の2つの頂点集合に分割すること - $s\in S$ - $t\in T$ - 任意の頂点は、必ずどちらか一方に属する必要がある カットの容量を$c(S, T) = \sum_{u\in S}\sum_{v\in T} c(u, v)$と定義する 最小カット問題は、このカットの容量が最小であるカットを発見せよという問題 ## 最大流最小カット定理証明 ネットワーク$G = (V, E, s, t)$についてフロー$f$とカット$(S, T)$と交差する純フロー $f(S, T) = \sum_{u\in S} \sum_{v\in T} f(u, v) - \sum_{u\in S}\sum_{v\in T} f(v, u)$ - $T$から$S$に戻ってくる水を差し引いている **補題: フロー$f$とカット$(S, T)$について$f(S, T) = |f|$が成り立つ** 証明 式$\sum_{v\in V}f(s, v) - \sum_{v\in V}f(v, s) + \sum_{u\in S - \{s\}} (\sum_{v\in V} f(u, v) - \sum_{v\in V}f(v, u))$について考える。 前2項はフローの定義そのものであり、フロー保存則より後ろの項は$0$である。つまりこれは$|f|$と一致する - $t\notin S$であることに注意 $|f| = \sum_{v\in V}f(s, v) - \sum_{v\in V}f(v, s) + \sum_{u\in S - \{s\}} (\sum_{v\in V} f(u, v) - \sum_{v\in V}f(v, u))$ $|f| = \sum_{v\in V}f(s, v) - \sum_{v\in V}f(v, s) + \sum_{u\in S - \{s\}} \sum_{v\in V} f(u, v) - \sum_{u\in - \{s\}}\sum_{v\in V}f(v, u)$ $|f| = \sum_{v\in V}(f(s, v) + \sum_{u\in S - \{s\}}f(u, v))- \sum_{v\in V}(f(v, s) - \sum_{u\in - \{s\}}f(v, u))$ $|f| = \sum_{v\in V}\sum_{u\in S}f(u, v) - \sum_{v\in V}\sum_{u\in S}f(v, u)$ - ここまで全部機械的な式変形 $S\cap T = \phi$より $|f| = \sum_{v\in S}\sum_{u\in S}f(u, v) + \sum_{v\in T}\sum_{u\in S}f(u, v) - \sum_{v\in S}\sum_{u\in S}f(v, u) - \sum_{v\in T}\sum_{u\in S}f(v, u)$ $\sum_{T}\sum_{S}$のやつを前側にもってくる $|f| = \sum_{v\in T} \sum_{u\in S} f(u, v) - \sum_{v \in T}\sum_{u\in S} f(v, u) + \sum_{v\in S} \sum_{u\in S} f(u, v) - \sum_{v \in S}\sum_{u\in S} f(v, u)$ $\sum_{u\in S}\sum_{v\in S} f(u, v) = \sum_{u\in S}\sum_{v\in S}f(v, u)$なので(それはそう)、後ろ二項が$0$ $|f| = \sum_{v\in T} \sum_{u\in S} f(u, v) - \sum_{v \in T}\sum_{u\in S} f(v, u)$ 右辺が純フローの定義と一致している (終了) **系[^1]: 任意のフロー$f$は同一ネットワーク上の任意のカット容量で抑えられる** 純フローの式とカット容量の式を見比べると一目瞭然 **この事から、フロー$|f|$が最小カット容量$c(S, T)$と一致するなら$f$は最大フローであることがわかる** 次にフロー$f$が最大フローならば$|f| = c(S, T)$であることを証明しなければならない - もしかしたら最大フローの値が最小カット容量より小さいかもしれない。これがありえないことを示さなければいけない #### 残余ネットワークと増加路 フローアルゴリズムでは残余ネットワークが良く出現するのは流石に知ってる。 - 押し戻しの辺があるやつ 増加路(augument path)は残余ネットワーク上の$s-t$パス$p$を指す。この$p$の残余容量(residual capacity)を$\min c_f(p)$で定義する - 当然残余容量は正 - 英語問題の解説で見かける単語だ。 - 増加路を発見したら、そこにめいいっぱい(残余容量分)流すやつがFord-Fulkersonだよね(だよね?) [^1]: ある定理から容易に導けるものを系と呼ぶそうです。 この用語を使って、証明の続きが。 最大フロー$f$から誘導される残余ネットワーク上では増加路は存在しない(存在したらそこに水を流して真に$f$より大きい値のフローを得られるため$f$が最大フローであることと矛盾している) - 本当は増加路$p$に水を流したらフローが水を流した分だけ増加することを証明しなければいけない(書くのがだるくなってしまった) フロー$f$から誘導される残余ネットワークが増加路を持たない時、$|f| =$最小カット容量であることを示す。