網路流入門

2022-08-05 15:51:19 字數 2383 閱讀 8126

通常可以把這些邊想象成道路,流量就是這條道路的車流量,容量就是道路可承受的最大的車流量。很顯然的,流量<=容量。而對於每個不是源點和匯點的點來說,可以模擬的想象成沒有儲存功能的貨物的中轉站,所有「進入」他們的流量和等於所有從他本身「

出去」的流量。

求解思路:首先,假如所有邊上的流量都沒有超過容量(不大於容量),那麼就把這一組流量,或者說,這個流,稱為乙個可行流

乙個最簡單的例子就是,零流,即所有的流量都是0的流。

補充:

為什麼要增加反向邊?在做增廣路時可能會阻塞後面的增廣路,

或者說,做增廣路本來是有個順序才能找完最大流的。

但我們是任意找的,為了修正,就每次將流量加在了反向弧上,讓後面的流能夠進行自我調整。

舉例:比如說下面這個網路流模型

我們第一次找到了1-2-3-4這條增廣路,這條路上的delta值顯然是1。

於是我們修改後得到了下面這個流。(圖中的數字是容量)

這時候(1,2)和(3,4)邊上的流量都等於容量了,我們再也找不到其他的增廣路了,當前的流量是1。

但是,

這個答案明顯不是最大流,因為我們可以同時走1-2-4和1-3-4,這樣可以得到流量為2的流。

那麼我們剛剛的演算法問題在**呢?

問題就在於我們沒有給程式乙個「後悔」的機會,應該有乙個不走(2-3-4)而改走(2-4)的機制。

那麼如何解決這個問題呢?

我們利用乙個叫做反向邊的概念來解決這個問題。即每條邊(i,j)都有一條反向邊(j,i),反向邊也同樣有它的容量。

我們直接來看它是如何解決的:

在第一次找到增廣路之後,在把路上每一段的容量減少delta的同時,也把每一段上的反方向的容量增加delta。

c[x,y]-=delta;
c[y,x]+=delta;
我們來看剛才的例子,在找到1-2-3-4這條增廣路之後,把容量修改成如下:

這時再找增廣路的時候,就會找到1-3-2-4這條可增廣量,即delta值為1的可增廣路。將這條路增廣之後,得到了最大流2。

那麼,這麼做為什麼會是對的呢?

事實上,當我們第二次的增廣路走3-2這條反向邊的時候,就相當於把2-3這條正向邊已經是用了的流量給「退」了回去,不走2-3這條路,而改走從2點出發的其他的路也就是2-4。

如果這裡沒有2-4怎麼辦?

這時假如沒有2-4這條路的話,最終這條增廣路也不會存在,因為他根本不能走到匯點

同時本來在3-4上的流量由1-3-4這條路來「接管」。而最終2-3這條路正向流量1,反向流量1,等於沒有流。

附錄:(edmonds-karp版本)

1: void update_residual_network(int u,int

flow)

7: }

8: int find_path_bfs(int s,int

t)

27: }

28: }

29: if(pre[t]==-1) return0;

30:

31: return

min;

32: }

33: int edmonds_karp(int s,int

t)while( new_flow != 0

);

41: return

max_flow;

42: }

網路流入門

網路流的最經典應用就是最大流.給定乙個圖.給出每條邊能流過的最大流量.求源點到匯點的最大流量.求解網路流的基本思想就是每次尋找增廣路 就是源點到匯點的一條可行路 然後ans 增廣路能流過的流量.更新剩餘網路.然後再做增廣路.直到做不出增廣路.關於網路流入門最難理解的地方就是剩餘網路了.為什麼在找到一...

網路流入門術語定理

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

網路最大流入門

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