前言
StoerWagner算法是一個找出無向圖全局最小割的算法,本文需要讀者有一定的圖論基礎。
本文大部分內容與詞匯來自參考文獻(英文,需科學上網),用興趣的可以去讀一下文獻。
概念
- 無向圖的割:有無向圖\(G=(V,E)\),設\(C\)為圖\(G\)中一些弧的集合,若從\(G\)中刪去\(C\)中的所有弧能使圖\(G\)不是連通圖,稱\(C\)圖\(G\)的一個割。
- \(S-T\)割:使得頂點\(S\)與頂點\(T\)不再連通的割,稱為\(S-T\)割
- \(S-T\)最小割:包含的弧的權和最小的\(S-T\)割,稱為\(S-T\)最小割。
- 全局最小割:包含的弧的權和最小的割,稱為全局最小割。
- 誘導割(induced cut):令圖\(G=(V, E)\)的一個割為\(C\),則割\(C\)在圖\(G\)的子圖\(G'=(V',E')\)中的部分稱為割\(C\)的誘導割。(類似於概念誘導子圖(induced subgraph))
算法流程
大致流程
step1:在圖\(G\)中找出任意\(s-t\)最小割cut-of-the-phase
step2:合並\(s\)、\(t\),重復執行step1直到圖G只剩下一個頂點
step3:輸出最小的cut-of-the-phase為最終結果
偽代碼:
def MinimumCutPhase(G, w, a):
A ← {a}
while A ≠ V:
把與A聯系最緊密(most tightly)的頂點加入A中
cut-of-the-phase ← w(A \ t, t)
合並最后兩個加入到A的頂點s、t
return cut-of-the-phase
def StoerWagner(G, w, a):
while |V| > 1
MinimumCutPhase(G, w, a)
根據返回值更新最小割
其中:
- \(w\)為邊權函數,\(w(e)\)為邊\(e\)的權值大小
- \(w(A, v)\)為頂點\(v\)到集合\(A\)的所有邊權和
- \(x\)與\(A\)聯系最緊密(most tightly)當且僅當\(x \notin A\)且\(w(A,x) = max\{w(A, y) | y \notin A\}\)
- \(a\)可以取任意頂點作為算法的初始頂點
證明
首先,算法基於這樣一個事實:
兩個頂點s、t,要么在全局最小割的同一個集合中,要么在不同的集合中
那么結果便只可能在是\(s-t\)最小割,或者合並\(s\)、\(t\)的新圖的全局最小割。
然后問題就在於如何尋找任意的\(s-t\)最小割。現在來證明MinimumCutPhase找出來的\(s-t\)割cut-of-the-phase為什么是最小的。
定理:每個階段割(cut-of-the-phase)是當前圖的\(s-t\)最小割,\(s\)、\(t\)是當前階段最后加入的結點。
證明:
以加入集合\(A\)的順序組成一個序列,以\(a\)為開始,以\(s\)、\(t\)結束。然后來證明對於任意\(s-t\)割\(C\)均不小於階段割(cut-of-the-phase)
我們稱結點\(v\)(\(v \neq a\))是活躍的(active)當\(v\)和\(v\)的前一個結點分立於C的兩邊。令\(w(C)\)為割C的大小,\(A_v\)為所有在\(v\)前面的頂點(不包括\(v\)),\(C_v\)為\(A_v \bigcup \{v\}\)的\(C\)割,\(w(C_v)\)為誘導割\(C_v\)的大小。
那么,對於所有活躍的頂點v,有
歸納證明:
對於第一個活躍頂點\(v_0\),該不等式以等號成立。這是由於\(v_0\)前面的點都非活躍點,那么它們都在割C的同一側,另一側為\(v_0\),顯然有\(w(A_{v_0},v_0) = w(C_{v_0})\)。
假設對於活躍頂點\(v\),\(v\)滿足不等式。令\(u\)為\(v\)的下一個活躍頂點,那么我們令:
由於\(v\)加入\(A\)比\(u\)早,所以有\(w(A_v,u) \leq w(A_v,v)\)。又因\(v\)滿足不等式,所以有
由於所有 \(A_u \setminus A_v\) 與\(u\)之間的邊均跨過割\(C_u\),且不是\(C_v\)的一部分,於是有
聯立上式,得到:
於是對於任意活躍頂點,均滿足不等式\((1)\)。
由於\(t\)總是活躍頂點(\(s-t\)割導致\(s\)與\(t\)總被割開),則\(t\)總是滿足不等式\(w(A_t,t) \leq w(C_t)\),即任意割小於等於\(w(A_t,t)\)。又因為\(w(A_t,t)\)為單獨割掉頂點\(t\)的大小(鏈接\(t\)的所有邊權和),所以有\(w(A_t,t)\)為\(s-t\)最小割。證得MinimumCutPhase找出來的\(s-t\)割是\(s-t\)最小割。
例題
HDU 3691 Nubulsa Expo(全局最小割Stoer-Wagner算法)
HDU 6081 度度熊的王國戰略(全局最小割Stoer-Wagner算法)