edmonds-karp算法求最大流

ek算法能在o(v*e^2)時間裏求出最大流

思路:每一步對殘量網絡進行一次s到t的bfs,以這次bfs的結果作爲增廣路,更新殘量網絡。用bfs找增廣路可以避免回頭的情況。

也可以用dfs搜,只要能搜出來條路就行

但是光這樣還不行

考慮這樣一個情況



爲方便,令每條邊上的權值爲1

如果直接搜的話,會搜成這樣


第一次搜的是紅的那條,第二次搜的是藍的那條。可以看到第二次就停了,得到的流量就只有1,但是顯然這個圖的流量是2。

ek的另一個操作就是反向邊,每次更新路徑時,正向路徑的權值減去本次流量,反向權值加上這次流量

這樣的話第一次搜索完以後圖就變成了這樣

紅色是更新的邊,原來的邊因爲權值沒了所有去除。藍色是第二次搜索的路徑。

爲啥這麼操作可行呢

這個操作相當於是一種“反悔”操作,顯然如果直接構造兩條正確的路徑就是1-2-5-6和1-3-4-6,這兩個裏面都沒有2-4,在上面的操作中2-4也被一正一反抵消掉了。

以及,每次選那條路徑的順序並沒有所謂,只要最後所有路徑的和等於最大流就行了,所以就可以在搜索中反覆反悔。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章