網路流模板
阿新 • • 發佈:2018-12-18
網路流,顧名思義,是求網路中的流量。 這裡的教程比較容易理解
主要性質:
- 容量限制 任何邊的流量不能超過其流量。
- 斜對稱 顯然,若一條邊的流量為w,即從u->v流量為w,可以看作是從v->u流量為-w。
- 流量守恆 網路中除原點,匯點以外,任何節點不儲存流。這個也比較容易說明,因為如果某一時刻某個中間節點儲存了流,則下一時刻它會儲存更多。最後儲存滿了,這些滿的流量不能流向匯點,就浪費了。
(lyd:網路流模型可以形象的描述為:在不超過流量限制的前提下,“流”從原點不斷產生,流經整個網路,最終全部歸於匯點。)
Edmonds-Karp演算法
增廣路:如果一條從起點到終點的路徑上剩餘流量都大於零,則最大流可以加上這條邊流量的瓶頸,即這條路徑上的最小剩餘流量。EK的思想就是不斷尋找增廣路,直到找不到增廣路為止。
具體實現:每次用BFS尋找增廣路,若找到了,則將這條路徑上的所有邊減少增加的流量,還要把其反向邊的流量增加相同的數值,重複上述過程,直到找不到增廣路。
為什麼要增加反向邊的流量?因為演算法不能保證每次找到的都是最優解。而構建反向邊,則給了程式一個“反悔”的機會。在構建反向邊後,如果另一條增廣路需要經過已經尋找到增廣路上的邊,而這條邊已經沒有剩餘流量了,就可以讓原來的那條增廣路走另一條路,這樣又可以拓展出一條增廣路。
如圖,若是一條增廣路,當尋找從點的增廣路時可以把點的部分流量導到B點,即A的流量就變成了和兩條。再拓展這條路,就使得答案增加了。這一操作其實就等價於反向邊上增加流量,因為反向邊上增加多少,正向邊就減少多少。