求最大流:
? ? ? ?求最大流的過程,就是不斷找到一條源到匯的路徑,然后構建殘余網絡,再在殘余網絡上尋找新的路徑,使總流量增加,然后形成新的殘余網絡,再尋找新路徑…..直到某個殘余網絡上找不到從源到匯的路徑為止,最大流就算出來了。重要的一點就是建立反向邊。
Edmonds-Karp 最短增廣路算法:
? ? ? 先用BFS找到從源點到匯點的最短可行路徑,并記錄每個點的前驅點和路徑上最小的流量值,然后反向從匯點到源點的邊把最小流量值減去的同時加上反向邊,不斷這樣找,直到找不到路時就結束,把所求的最小流量值加起來就得到最大流。
Dinic 快速網絡流算法:
先利用BFS對殘余網絡分層,分完層后,從源點開始,用DFS從前一層向后一層反復尋找增廣路(即要求DFS的每一步都必須要走到下一層的節點),復雜度為O(n^2m)。
有源上下界網絡最大流:
? ? ? 先對原圖把所有下界通過兩個超級匯點st-ed替換,原圖的流量就是上界-下界,然后加上一條流量無窮大的t-s邊,求出最大流,求出s匯點的流出的量記錄為sum1并檢查超級匯點的流量是否流滿,如果滿流,就滿足下界的條件,然后把超級匯點、所連的邊和無窮大的t-s的邊刪除,然后再求一次s-t的最大流,記錄為sum2,最后滿足條件的最大流就是sum1+sum2;如果不滿足,就不能求出滿足題意的最大流。