← 回首頁

網路流 Edmonds-Karp 最大流

想像一張自來水管網:從水廠出發,經過好幾條粗細不同的管子,最後匯到你家水龍頭——每條管子每秒能過多少水都有上限。 最大流問題(Maximum Flow)問的就是:整張網一次到底能送出多少水?現實裡到處都是這種題,像貨運排班、網路頻寬分配都能化成它。 難處在於某條看似順的路,可能卡住另一條更划算的走法,所以演算法得能「反悔」、把水退回去改道。 下面你會看到 Edmonds-Karp 一輪一輪找路、把水灌到滿的完整過程。

最大流問題(Maximum Flow)要在一張帶容量的有向圖上,求出從源點 s 到匯點 t 能同時推送的最大流量。 Edmonds-Karp 是 Ford-Fulkerson 方法的具體實作:每一輪都在「殘餘圖」上用 BFS 找一條 s→t 的最短增廣路, 沿路推送該路徑上的瓶頸容量(路徑上殘餘容量的最小值),直到 s→t 在殘餘圖中不再可達為止。 殘餘圖的關鍵直覺是反向邊:每推一次流,就在反方向開出等量的「反悔」容量——如果後面發現這條邊推錯了方向, 可以透過反向邊把流量退回去、改走別條路徑。反向邊的初始容量為 0,只有正向邊被推流之後才會出現非零的殘餘容量。

固定流網路:CLRS 經典範例(s=0, t=5),獨立 DFS 真值算出的最大流為 23
累計增廣次數:0
目前最大流 maxFlow 0
紅色為 BFS 當前處理節點;黃框為佇列中待處理(frontier);綠色為本輪已訪問;綠色粗邊為本輪回溯出的增廣路徑; 橘色高亮邊為正在更新 flow 的邊(含虛擬反向邊,高亮同一條實體管線);邊上文字為即時 flow/cap

增廣紀錄(每輪路徑與瓶頸,依發生順序累積)

殘餘容量(僅列殘餘容量 > 0 的邊;cap=0 為反向虛擬邊)