網路流入門

2021-06-22 17:25:01 字數 2521 閱讀 1431

網路流的最經典應用就是最大流....給定乙個圖...給出每條邊能流過的最大流量...求源點到匯點的最大流量....

求解網路流的基本思想就是每次尋找增廣路(就是源點到匯點的一條可行路)..然後ans+=增廣路能流過的流量..更新剩餘網路..然後再做增廣路...直到做不出增廣路..關於網路流入門最難理解的地方就是剩餘網路了....為什麼在找到一條增廣路後...不僅要將每條邊的可行流量減去增廣路能流過的流量...還要將每條邊的反向弧加上增廣路能流過的流量.?..原因是在做增廣路時可能會阻塞後面的增廣路...或者說做增廣路本來是有個順序才能找完最大流的.....但我們是任意找的...為了修正...就每次將流量加在了反向弧上...讓後面的流能夠進行自我調整...剩餘網路的更新(就在原圖上更新就可以了):

while (nowpoint!=

1)2         

最近又複習了下最大流問題,每次看這部分的內容都會有新的收穫。可以說最大流問題的資料網上一搜一大把,根本沒有必要自己寫;但是大部分資料上的專業術語太多了,初學很難理解,至少我當年學這部分的時候前幾次就沒有看懂。所以我準備備份一點個人的理解。

如圖-1所示,在這個運輸網路中,源點s和匯點t分別是1,7,各邊的容量為c(u,v)。圖中紅色虛線所示就是乙個可行流。標準圖示法如圖-2所示:

其中p(u,v) / c(u,v)

分別表示該邊的實際流量與最大容量。 

關於最大流

熟悉了什麼是網路流,最大流也就很好理解了。就是對於任意的u

∈v-,

使得p(s,u)的和達到最大。上面的運輸網路中,最大流如圖-3所示:maxflow=p(1,2)+p(1,3)=2+1=3。

在介紹最大流問題之前,先介紹幾個概念:殘餘網路,增廣路徑,反向弧,最大流定理以及求最大流的ford-fulkerson方法。

殘餘網路 增廣路徑 反向弧

觀察下圖

-4,這種狀態下它的殘餘網路如圖

-5所示:

也許現在你已經知道什麼是殘餘網路了,對於已經找到一條從s 到t的路徑的網路中,只要在這條路徑上,把c(u,v)的值更新為c(u,v)-p(u,v),並且新增

反向弧c(v,u)。對應的增廣路徑path為殘留網路上從s到t的一條簡單路徑。圖-4中1,2,4,7就是一條增廣路徑。(圖5中的c->t為1/1)

此外在未做任何操作之前,原始的有向圖也是乙個殘餘網路,它僅僅是未做任何更新而已。

最大流定理

如果殘留網路上找不到增廣路徑,則當前流為最大流;反之,如果當前流不為最大流,則一定有增廣路徑。

ford-fulkerson方法

介紹完上面的概念之後,便可以用ford-fulkerson方法求最大流了。為什麼叫ford-fulkerson方法而不是演算法,原因在於可以用多種方式實現這一方法,方式並不唯一。下面介紹一種基於廣度優先搜尋(bfs)來計算增廣路徑p的演算法:edmonds-karp演算法。

演算法流程如下:

設佇列q:儲存當前未訪問的節點,隊首節點出隊後,成為已檢查的標點;

path陣列:儲存當前已訪問過的節點的增廣路徑;

flow陣列:儲存一次bfs遍歷之後流的可改進量;

repeat:

path

清空;

源點s進入path和q,path[s]

+∞;

while q

非空 and 匯點t未訪問 do

begin

隊首頂點u出對;

for每一條從u出發的弧(u,v) do

if v

未訪問 and 弧(u,v) 的流量可改進;

then flow[v]

min(flow[u],c[u][v]) and v入隊 and path[v]

end while

if(匯點t已訪問)

then 

從匯點t沿著path構造殘餘網路;

until 匯點t未被訪問

求解最大流流最原始的演算法是ford_fulkerson..也就是上面提到的每次找任意的找增廣路...加上增廣路流量再更新剩餘網路...可以看出找最大流最耗時的地方就是尋找增廣路..edmonds_karp是對ford_fulkerson的乙個優化演算法...ford_fulkerson是任意尋找增廣路...而edmonds_karp是每次尋找從源點到匯點可行的最短的增廣路...其優勢是可以在前期就卡斷很多不必要的尋找增廣路而又到不了匯點的過程...其優化的方法也很簡單..就是將ford_fulkerson找增廣路的過程用bfs實現..

乙個找最大流更好的優化則是dinic..優化的地方也是找增廣路的過程....dinic做了乙個預處理...將所有點按到源點的距離分層...然後在尋找增廣路時..只有要拓展點與當前點的距離差為1時才拓展...其原理我還沒弄明白..只知道演算法的基本思路...

dinic的過程是 : 

1、bfs做出層次網路

2、dfs尋找增廣路

code:

1void dinic()

2      

8 }**

網路流入門

通常可以把這些邊想象成道路,流量就是這條道路的車流量,容量就是道路可承受的最大的車流量。很顯然的,流量 容量。而對於每個不是源點和匯點的點來說,可以模擬的想象成沒有儲存功能的貨物的中轉站,所有 進入 他們的流量和等於所有從他本身 出去 的流量。求解思路 首先,假如所有邊上的流量都沒有超過容量 不大於...

網路流入門術語定理

容量網路 設g v,e 是乙個有向網路,在v中指定了乙個頂點,稱為源點 記為vs 以及另乙個頂點,稱為匯點 記為vt 對於每一條弧 弧的流量 通過容量網路g中每條弧 網路流 所有弧上流量的集合f 稱為該容量網路的乙個網路流.可行流 在容量網路g中滿足以下條件的網路流f,稱為可行流.a 弧流量限制條件...

網路最大流入門

網路最大流是網路流中最基礎也是最重要的部分,後邊的許多模型也都是由最大流問題引申而來的 在研究這個問題之前,讓我們先來學習一下前置知識 設 f u,v 表示邊 u,v 的當前容量上限 設 c u,v 表示邊 u,v 的最大容量上限 如果網路流圖中的流量滿足 則稱該流為乙個可行流 增廣 即增加一條路徑...