請問求一個圖的全局最小割,有什麼比較快的演算法?
算是個比較好搜的題目,憑經驗搜一下就好了……
隨便寫點翻譯好了……(只會常用的,捂臉
一個無向圖
的割
滿足
,這個割的代價是
。而
割則是滿足
的全局割
。對於這樣的圖,割一共有
種,最小割是其中代價最小的某一個割。為了將割與
割區分開來,有時也稱割為全局割。
一、我會暴力!
如果這個無向圖不連通,那麼全局最小割是很簡單的,否則由最大流最小割定理可知,求解
最小割的對偶問題是求解
為源點、
為匯點的最大流問題,存在許多多項式時間的演算法可以解決。注意到
最小割本身就是一個全局割,那麼全局最小割一定會是某一種
最小割,求解全局最小割最暴力的確定性演算法就是隨便固定一個點
,枚舉
種可能的
,分別求解
最小割。
二、我會隨機!
Karger『s algorithm是這樣一個怪力亂神的隨機演算法:每次隨機時,它會不斷地從剩下的圖中選出一條邊,將這條邊的兩個端點縮在一起,直到整個圖剩下兩個端點,那麼原圖中分別被縮到這兩個端點的那些點分別構成了
集和
集,對應的割也可以直接從圖中求得。
每次隨機的時間複雜度是
的,隨機
次之後還沒有找到全局最小割的概率小於
。
他們順便擴展了一下這個演算法,每次隨機兩次將點集的大小縮到原來的
,分別遞歸求解相同問題,取最優值作為結果。他們表示這樣可以在
的時間裡以出錯可能小於
的概率找到全部最小割。
&
不過,直接隨機選點對求最大流不就好了嗎?&
三、我會演算法!
Stoer—Wagner algorithm是這樣一個奧妙重重的確定演算法:每次嘗試得到當前圖中某兩個特殊點之間的
最小割,將它們縮成一個點,直到整個圖縮成一個點,全局最小割即這個過程中計算過的
最小割中的最小值。(???這複雜度不是暴力嗎?
與直接做
次
最小割不同的是,該演算法中使用的
和
是在求解過程中確定的,而不是直接給定的。
每次在當前的無向圖
中不斷維護一個點集
,初始點集
包含一個任選的點
,當
時選取
且
最大的點
加入點集
,直到
時結束,此時令倒數第二次加入
的點為
,最後一次加入
的點為
,則
最小割為割
。正確性的話,證明其他
割都不比它小就好了。
縮點一供要縮
次,每次找
可以做到時間複雜度
或者
。
四、圖是平面圖!
由平面圖的對偶定理可知,原圖的每一個割都對應著新圖的每一個環,所以求解原圖中的
最小割可以通過一些簡單的對偶變成求解對偶圖中的最短路問題。
而對於求解全局最小割,我們也可以使用分治的方法在對偶圖中求解最小環。每次在對偶圖中任選一個點
為源點,構建對偶圖的最短路樹,再在對偶圖中找到一個區域
(對應原圖中的點
)以及與它鄰接的兩個點
和
,令
之間的這個環是
(即
最短路徑、
最短路徑、使
被包含在
內部的那條在
上
之間的路徑),將原圖根據
的內部與外部劃分成兩個部分(不含
),給這兩部分分別加一個新點代表
,即可遞歸求解不跨越
的最小環,否則若要經過
,則可以找到
到
路徑上的第一條邊所鄰接的不在
內部的那個區域
(對應原圖中的點
),可證原圖的全局最小割一定不會將
與
歸在同一點集,那麼只需要求解
最小割就好了。
注意到平面圖有
,隨手寫一下的時間複雜度是
的,再努努力優化一下應該可以做到
,具體請參考ftiasch 的回答 - 平面圖最小環。(順手 at 卡不掉錯誤演算法的@趙軒昂 )
五、我不管全局最小割了!我要多次詢問
最小割!
這可能就有點超出能力範圍了?
&
我還是老老實實做次
最小割吧……&
不要慌,我覺得還行!
這裡要介紹一個求解
次
最小割的方法Gomory—Hu tree,做法很簡單,證明個人認為需要想一會。
對於一個連通無向圖
,我們嘗試構建一個新的樹
,其中
中的元素是由
中一些點組成的點集(即元素是集合),初始
,我們將不斷地把
中的點分裂,直到最終
中的每一個元素都是
中某一個點組成的點集並在兩者之間能形成雙射,此時求解
割即計算
中點
到點
路徑上的最小邊權值。
分裂是指每次選擇一個點集
,滿足
中至少有兩個
中的點,並從中選出兩個點
,求解
最小割
,將
劃分成
兩個點,在它們之間連一條邊權值為
的邊,之前與
相連的邊也根據另一個端點屬於
或
來確定連向
或
即可。
此外,Gomory—Hu tree 也經常作為近似求解
連通塊最小割的演算法例子。
隨手寫的很倉促,不知道有什麼要補充的,待我趕完 deadline 再來修一修 T_T
2017年我們有個paper裡面的introduction里提到了這些. http://chaoxu3.web.engr.illinois.edu/paper/hypergraph.pdf
裡面除了Henzinger, Rao, Wang的那個都有reference. 這個introduction應該完全survey了有關的內容. 所以讀讀應該會了解到所有的情況.
(話說日本那邊對Stoer-Wagner不是很爽. 當時給talk的時候被Satoru Iwata教育了. 因為Nagamochi-Ibaraki更早的給出演算法了, 憑什麼大家都在cite那個Stoer-Wagner...
Deterministic還沒有. 哪個人能給出deterministic擊敗Stoer-Wagner的話那重要程度絕對是stoc/focs best paper級別.
randomized話 karger早就有了
級別的演算法.
圖是simple graph, 則
存在. 看Kawarabayashi和Thorup. 後來Henzinger, Rao, Wang 給了更快的演算法不過只是log級別的提升. (paper里沒有提到. 因為太新了. https://arxiv.org/abs/1704.01254)
圖是unweighted graph, 則可以先找k-certificate然後再用SW演算法. 可以O(m)時間把邊的個數變成O(kn)個. 所以k很小的話速度還蠻快的. 這樣
就是
. paper的survey裡面應該還列舉了一些其他的比如Gabow的
的演算法.
有向圖要用Hao-Orlin是暫時最快的. 我不記得Gabow是不是在log上面稍微擊敗了Hao-Orlin.
以及open problem: 圖的全局最小的非平凡割?
推薦閱讀:
※人的思維存在範式嗎?
※刷完了leetcode,接下來刷哪個網站比較好呢?
※計算機快速計算2^N是如何實現的?
※迪傑斯特拉演算法(Dijkstra)的本質是貪心還是動態規劃?
※對於各進位之間的轉換有什麼好方法嗎?
