Minimum Cut Tree

Minimum Cut Tree(Gomory–Hu Tree)

「最小割樹」。樹上任意兩點,作為s點、t點。兩點連成路徑,找到瓶頸(權重最小的邊)。瓶頸的兩側,即是s側、t側。瓶頸的權重,即是Minimum s-t Cut的權重。

一張無向圖的最小割樹,可能有許多棵。一張有向圖的最小割樹,至今仍未被發現。

最小生成樹:任意兩點之間的路徑,最寬的邊盡量窄。
最小割樹:任意兩點之間的所有通道,最寬的切面盡量窄。

UVa 11603 10816 ICPC 4848

數學性質:Submodularity

兩個集合、交集、聯集,四者之間的不等式。

當圖上無負邊,任意兩個割,其權重都符合這個不等式。

數學性質:聯集交集

最小st割、最小xy割,S∪X與T∩Y形成新的割。

當交集不是空集合,新的割可能是:另一個最小st割、另一個最小xy割、權重更小或一樣的其他割、權重不明的其他割。

根據stxy四個點所在位置,可以鑑定結果是哪幾種。

一、令cut(S)是最小st割。令cut(X)是最小xy割。
  cut(S) + cut(X) ≥ cut(S∩X) + cut(S∪X)。
二、討論cut(S∩X):
 甲、假設cut(S∩X)不含s點、不含t點。
   此時歸納不出任何結論。
 乙、假設cut(S∩X)含有s點、不含t點,是個st割。
   因為cut(S∩X)是st割,又知道cut(S)是最小st割,所以
   cut(S∩X) ≥ cut(S)。
   然後併入步驟一的結論,輕鬆得到
   cut(S∪X) ≤ cut(X)。
三、討論cut(S∪X):
 甲、假設cut(S∪X)含有x點、不含y點,是個xy割。
   以最小xy割cut(X)為基準,根據叛離性質,
   cut(S∪X)的權重只會變大(或不變),所以
   cut(S∪X) ≥ cut(X)。
   然後併入步驟二乙的結論,輕鬆得到
   cut(S∪X) = cut(X)。
   證得cut(S∪X)與cut(X)都是最小xy割。
 乙、假設cut(S∪X)含有x點也含有y點,不是個xy割。
   此時無法套用叛離性質。
   使用步驟二乙的結論
   cut(S∪X) ≤ cut(X)。
   證得cut(S∪X)是比cut(X)權重更小(或一樣)的其他割。
順帶一提,
步驟二,改為假設cut(S∩X)是xy割。
步驟三,改成st割。
最後證得cut(S∪X)與cut(S)的關係。
附帶一提,無向圖上,一個割的兩側,對調也無妨。
cut(S∪X) = cut(T∩Y)。

數學性質:瓶頸

最小割樹,任兩點路徑瓶頸,形成最小源匯割。

已知一個最小st割。隨意取兩個點,x點與y點。

一、兩點都在s側(或者兩點都在t側):

根據交集聯集性質,最小xy割不只一個。某個最小xy割的某一側,可以完全包含t側。收縮t側,不影響某些最小xy割!

二、x點在s側、y點在t側(或者反過來):

根據基準性質,「最小xy割的權重」小於等於「最小st割的權重」。

All Pairs Minimum s-t Cuts: Gomory–Hu Algorithm

用途

無向圖,求得其中一棵最小割樹。

限制:無負邊。

演算法

Divide-and-Conquer Method。求V-1次最小源匯割。

Divide:
隨便求一個Minimum s-t Cut,得到s側、t側。
注意到s點和t點必須是圖上原本的點,而不是收縮之後的點。

Conquer:
此圖收縮t側(得t'點),遞迴求解,得到s側的Minimum Cut Tree。
此圖收縮s側(得s'點),遞迴求解,得到t側的Minimum Cut Tree。

Combine:
新增邊s't',權重設定為Minimum s-t Cut的權重。
所有新增的邊,最後拼在一起,構成一棵Minimum Cut Tree。

如果原圖已經有一部分是樹,此部分顯然就是最小割樹,不必再逐次計算最小st割。

時間複雜度

下列三項總和,主要取決於第一項:

一、求V-1次最小源匯割。

二、收縮點,O(V²)。

三、新增邊,共V-1條邊,O(V)。

查詢最小源匯割

最小割樹,隨便選定一個根,變成有根樹。仿照Lowest Common Ancestor演算法,計算源匯路徑的瓶頸(最小值),得到最小源匯割。

例如建立表格,得到所有兩點之間的最小源匯割,時間複雜度與空間複雜度都是O(V²)。

例如Jump Pointer Algorithm,建立二的次方祖先表格,即時查詢路徑最小值。建立O(VlogV)、查詢O(logV)。

UVa 11603

All Pairs Minimum s-t Cuts: Gusfield's Algorithm

用途

無向圖,求得其中一棵最小割樹。

限制:無負邊。

演算法

Incremental Method。求V-1次最小源匯割。

一、初始化最小割樹:
  第零點是中心,第一點到第V-1點皆連向第零點。
二、依序處理第一點到第V-1點:
 甲、當前點s,只有連向點t。
   邊st的權重設定為最小st割的權重。
 乙、屬於s側的點x,全部改為連往s點。
   邊xs保持原本設定的權重。

【待補程式碼】

Equivalent Flow Tree

簡易版的最小割樹。此樹只能求得最小st割的權重,但是不能求出最小st割。

一、初始化最小割樹:
  第零點是中心,第一點到第V-1點皆連向第零點。
二、依序處理第一點到第V-1點:
 甲、當前點s,只有連向點t。
   邊st的權重設定為最小st割的權重。
 乙、屬於s側、並且尚未處理的點,全部改為連往s點。

UVa 11594

Minimum Steiner Cut

Steiner Cut

一張圖,指定一些點,找到一個割,將這些點分為兩側。

Minimum Steiner Cut

權重最小的Steiner Cut,可能有許多個。

演算法是取這些點作為Minimum Cut Tree。

Minimum Steiner Tree是NP-complete問題,Minimum Steiner Cut是P問題。