1. 程式人生 > >網路流模板

網路流模板

網路流,顧名思義,是求網路中的流量。 這裡的教程比較容易理解

主要性質:

  • 容量限制 任何邊的流量不能超過其流量。
  • 斜對稱 顯然,若一條邊的流量為w,即從u->v流量為w,可以看作是從v->u流量為-w。
  • 流量守恆 網路中除原點,匯點以外,任何節點不儲存流。這個也比較容易說明,因為如果某一時刻某個中間節點儲存了流,則下一時刻它會儲存更多。最後儲存滿了,這些滿的流量不能流向匯點,就浪費了。

(lyd:網路流模型可以形象的描述為:在不超過流量限制的前提下,“流”從原點不斷產生,流經整個網路,最終全部歸於匯點。)

Edmonds-Karp演算法

增廣路:如果一條從起點到終點的路徑上剩餘流量都大於零,則最大流可以加上這條邊流量的瓶頸,即這條路徑上的最小剩餘流量。EK的思想就是不斷尋找增廣路,直到找不到增廣路為止。

具體實現:每次用BFS尋找增廣路,若找到了,則將這條路徑上的所有邊減少增加的流量,還要把其反向邊的流量增加相同的數值,重複上述過程,直到找不到增廣路。

為什麼要增加反向邊的流量?因為演算法不能保證每次找到的都是最優解。而構建反向邊,則給了程式一個“反悔”的機會。在構建反向邊後,如果另一條增廣路需要經過已經尋找到增廣路上的邊,而這條邊已經沒有剩餘流量了,就可以讓原來的那條增廣路走另一條路,這樣又可以拓展出一條增廣路。 在這裡插入圖片描述

如圖,若A>E>F>DA->E->F->D是一條增廣路,當尋找從C

C點的增廣路時可以把AA點的部分流量導到B點,即A的流量就變成了A>E>F>DA->E->F->DA>E>BA->E->B兩條。再拓展C>F>DC->F->D這條路,就使得答案增加了。這一操作其實就等價於反向邊上增加流量,因為反向邊上增加多少,正向邊就減少多少。