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也被一正一反抵消掉了。
以及,每次選那條路徑的順序並沒有所謂,只要最後所有路徑的和等於最大流就行了,所以就可以在搜索中反覆反悔。