給定一張圖,每條邊有容量,給定源點、匯點,求從源點到匯點的最大流量。
上述為一個最大流問題。在一個網路流問題中,我們定義:
而一個可行流,即是對於所有邊 找到一個流量 滿足:
要找最大流,我們可以不斷找一條尚未飽和的路徑,將其填充流量,直到找不到為止。但這樣會造成「路徑阻塞的問題」。考慮以下網路:
由於直接找路徑填充流量會造成阻塞,我們還需要「回推」錯誤的流。回推一條邊的流 ,也是幫 找到新的流量來源,幫 找到新的流量,使得在移除 的流量時,還能維持 的進出總量不變。
建構一個剩餘網路: 對於一個可行流,我們使 ,。直白的解釋,對於一條邊的容量,我們在剩餘網路蓋一條正向邊,表示剩餘的容量;再蓋一條反向邊,代表已經使用的容量,因此 。
假設有 ,則 :
若要對 「填充」或「移除」流量 ,則在剩餘網路上會如此表現:
因此我們可以在剩餘網路上找一條 路徑,其邊權皆至少為 ,然後把路徑上的邊都「填充」或「移除」流量 ,那我們就成功使最大流增加 了。此路徑稱為增廣路徑。通常我們會使 盡量大,使 為這條路的瓶頸。
增廣路徑最大流定理:若圖是簡單的,且所有容量為非負整數:
若有可行流 使得找不到增廣路徑 為最大流
則根據上述定理,不斷找出增廣路徑,就能找到最大流。而每次找到的增廣路流量至少為 ,因此複雜度為 。
找增廣路時使用 BFS,使得增廣路總是 最短路,則為 Edmond-Karps 算法,複雜度 。證明參考。
Dicnic 算法思想:
因為要找可行的增廣路徑,因此剩餘網路 ,只保留那些 的邊。接著從源點 BFS 得到每個點 的最短距離 並依此做分層,使得節點 只能連向 的節點 。稱分層後的圖 為「層次圖」。
在層次圖 上找到一個最大增廣流(可以有分支) ,稱為「阻塞流」。
Dicnic 算法流程如下:
在 Dicnic 結束後,不存在 路徑,不管怎麼走都會遇到一條邊 使得 。其意義為流量已經流滿。在剩餘網路上的特徵,是源點可以走到 但不可走到 。這條邊即為割邊。
Dicnic 的複雜度為 。在邊權皆為一的圖上,大約是 。做二分圖匹配時,複雜度為 。
若流量有每單位收費,即邊 有流量 則必須收取 ,則為費用流。費用流的思想是在每次尋找增廣路徑時,總是找花費最低的。做 Edmond-Kaprs 或 Dicnic 時改成最短路即可。
割:把節點劃分為兩個集合 ,其中 ,便是割。若邊 橫跨兩個集合,則屬於該割的割集 。而 割的容量為所有割集中的邊的權重和,即 。
不嚴謹地說,割即為圖的一個斷面。畫一條線割開 和 使得 不連通,線經過的邊即為割集。(如果在一條邊經過經過線偶數次,那麼它不屬於割集)。
最小割即為所有割中容量最小的,**也就是是在求 到 中流量最小的斷面。**容易相信,上面這個敘述跟最大流是等價,因此最大流和最小割是相同的問題。題目要求最小割集時,因為最小割集即是最大流流量瓶頸,因此在 Dicnic 時一旦找到最大流,那些 使得一邊可從 到達、一邊不可則屬於割集。總結而言,以下三件是等價:
名詞定義:
要注意的是最大匹配(maximum matching)和極大匹配(maximal matching)不同,極大匹配指的是沒辦法直接加入其他邊,已經達到飽和的情況。
有以下性質:
對於二分圖還有:
而二分圖的最大匹配可以用 Dicnic 求。二分圖帶權最大匹配則可以用 MCMF 求。
DAG 的最小路徑覆蓋:
DAG 的最小「不相交」路徑覆蓋可以轉成二分圖最大匹配來求,而最小「可相交」路徑覆蓋可以轉成不相交來求。
DAG 最小不相交路徑覆蓋:
將點 拆成 ,若有邊 ,則在新圖建邊 。新圖為二分圖,且最小不相交路徑覆蓋 = 新圖最大匹配。
證明:
一開始每個點都是一個路徑,每當選擇一個邊將就可以把兩個路徑首尾相連,即所需路徑數量減一。因此我們要求最大的邊集。但路徑不能相交,即一個點不能同時有一個以上的出度或入度,因此我們將入度和出度拆開,其中每個入度或出度都只能被一條邊覆蓋。因此新圖最大匹配即是路徑減少的數量。
DAG 最小相交路徑覆蓋:
若點 可以走到 ,則建邊 。
考慮 。路徑可以相交,即可能會出現 和 想同時存在,則此時讓第二條路徑直接略過 ,走 即可。
最大權閉合子圖:
拆點:
Reference
Template