甚麼是最大流問題 想像有一張由水管連接而成的網路,每條水管有容量限制,流過的水流不能超過這條水管的容量。這張圖上有兩個特別的節點:源點和匯點,源點是無限供水的地方,而匯點是收集水的地方。
source: https://www.geeksforgeeks.org/dsa/ford-fulkerson-algorithm-for-maximum-flow-problem/
目標:調整各條管線的流量,讓匯點 $T$ 能有最大輸入。
名詞介紹 網路 Network:一個有向圖 源點與匯點 Source and Sink:源點 $S$ 為網路流的起點、匯點 $T$ 為網路流的終點,其餘點為中間點 流量 Flow:每條邊上的數值,表示經過該條邊的流量,計為 $f(u,v)$ 容量 Capacity :每條邊上的最大流量,計為 $c(u,v)$ 殘餘容量 Residual Capacity:每條邊上容量減去流量的值,計為 $r(u,v) = c(u,v) - f(u,v)$ 剩餘網路 Residual Network:計算每條邊上的殘餘容量,以 $r(u,v)$ 畫成新的一張圖 網路流量:由源點出發至匯點的總流量,若該值達到最大,則稱為「最大流」 增廣路徑:在殘餘網路中,存在一條從源點 $S$ 到匯點 $T$ 的路徑,其路徑上的每一條邊殘餘容量皆大於 0($r(u,v) > 0$),只要能找到增廣路徑,就代表當前的總流量還可以再增加 反向邊:殘餘網路還包含了反向邊,流量為 $f(u, v)$。反向邊的作用是給予演算法反悔的機制,當發現從不同路徑能夠達到的流量更大,且兩個路徑經過同一條邊但相反方向時,反向邊可以抵消原本的流量,讓兩條路徑分開為不同路徑,此時這條邊的實際流量就會是 0。 舉個反向邊的例子,考慮以下流量網路:
如果演算法先找到了 $S \rightarrow A \rightarrow B \rightarrow T$ 這條路徑,輸送了 10 單位的流量,此時 $A \rightarrow B$ 這條邊已經被占滿了。其實最佳解法應該是 $S \rightarrow B$ 與 $A \rightarrow T$ 這兩條路可以組出 $S \rightarrow B \rightarrow T$ 與 $S \rightarrow A \rightarrow T$ 這兩條路徑,可以組出 20 單位的流量,如果第一步時在 $A$ 、 $B$ 之間建立建立一條反向邊 $B \rightarrow A$ ,演算法就可以繼續走 $S \to B \to A \to T$。此時從 $A \to B$ 的流被抵銷了,兩條路徑被拆成都不經過 $A \to B$ 這條邊。
...