網路流初步 最大流問題

2022-03-23 02:41:08 字數 3277 閱讀 5821

形象理解:就好比你家小區的供水系統,所有的水都來自自來水廠,經過管道運輸到你小區的使用者,再經過下水道去往廢水處理廠,整個過程中,自來水廠就好比源點,整個網路中的管道大小限制就好比容量,其中流過的水量好比流量,而最終的處理廠就好比匯點。

·網路流:所有弧上流量的集合f=,稱為該容量網路的乙個網路流.

定義:帶權的有向圖g=(v,e),滿足以下條件,則稱為網路流圖(flow network):網路流主要解決流量問題。

源點:整個網路流圖中只有乙個入度為0的點,它「製造」流量,並通過邊傳送給其他的節點。

匯點:整個網路流圖中只有乙個出度為0的點,它「消耗」流量。

容量:每條邊可以通過的最多流量。

·性質:

1、容量限制:0≤f(u,v)≤c(u,v),其中f為流量,c為容量。

2、斜對稱性:f(u,v)=-f(v,u)

3、流量平衡:即流入乙個非s,t節點的流量等於流出該點的流量。

·殘量網路:殘量網路=容量網路-流量網路

1、可行流:在容量網路g中滿足以下條件的網路流f,稱為可行流:

·弧流量限制條件: 0<=f(u,v)<=c(u,v);

·平衡條件:即流入乙個點的流量要等於流出這個點的流量,(源點和匯點除外).

如下圖:兩種流量均為可行流,第二種方式是該網路的最大流。(邊上數字為容量,框內數字為流量)

2、最大流:顧名思義,可行流中流量最大的流稱為最大流。(最大流可能不唯一)

3、增廣路:從s到t的一條路徑,經過的每一條邊流量均未滿,沿著增廣路增加流量的過程叫做增廣,顯然,當網路中沒有增廣路的時候,流量達到了最大,所以如何高效快速地找出所有增廣路是最大流演算法需要解決的問題。

·ek演算法

1、引入反向邊:請看下圖:

假設我們第一次沿著1->2->3->4這條增廣路增廣,將每條邊的流量增加1,之後我們就得到下面這張圖:

之後這張圖就沒有增廣路了,演算法結束,,,然而有眼睛的我們都知道,這個網路的最大流明顯是2。

引入反向邊後,我們就可以給程式乙個反悔的機會!!!

如下圖所示:加入反邊後可以讓程式把之前增廣的流量推掉~,從而得到正確答案

之後bfs延最短路(每個邊邊權看成1)增廣直到沒有增廣路即可。

1 #include2 #include3 #include4 #include5

#define n 200005

6using

namespace

std;

7int

read()811

while(ch>='

0'&&ch<='9')

12return x*f;13}

14int

n,m,x,y,z,v[n],w[n],head[n],nxt[n],cnt,s,t,pre[n],prepath[n];

15bool

vis[n];

16void add(int a,int b,int

c)17

24int

bfs()

2547}48

}49return0;

50}51int

ek()

5263 maxflow+=min;

64//

cout<

return

maxflow;67}

68int

main()

6978 cout

79return0;

80 }

view code

·dinic演算法

ek演算法的時間複雜度可能高達o(nm2),即使在絕大多數情況下達不到理論上界,但是狠心的出題人絕對會出資料卡ek......

考慮多路增廣。

這點使得dinic的時間複雜度可以銳減至o(n2m),而實現dinic的方法是bfs分層+dfs增廣,bfs分層後,我們就有了每個點的層數編號,對任意點u到點d的路徑如果有dep[d]==dep[u]+1,我們就可以判斷該路徑在一條最短增廣路上。

我們就可以進行增廣,達到一次分層多次增廣的效果。

1 #include2 #include3 #include4 #include5

#define m 500005

6#define n 100005

7#define inf 21374404

8using

namespace

std;

9int

read()

1013

while(ch>='

0'&&ch<='9')

14return x*f;15}

16int n,m,s,t,v[m],w[m],head[m],nxt[m],cnt=-1

,x,y,z,dep[n];

17bool

vis[n];

18void add(int a,int b,int

c)19

25int

bfs()

2648}49

}50}51

if(dep[t]!=0x3f3f3f3f)return1;

52return0;

53}54int dfs(int node,int

low)

5569}70

}71return0;

72}73int

dinic()

7482}83

return

maxflow;84}

85int

main()

8694 cout

95return0;

96 }

view code

本部落格部分內容摘自以下**

網路流初步學習之最大流

前一段陣子學了極小的一部分網路流,這裡做一些總結,主要還是給自己看的a 給出乙個網路圖,以及其源點和匯點,求出其網路最大流。第一行包含四個正整數n m s t,分別表示點的個數 有向邊的個數 源點序號 匯點序號。接下來m行每行包含四個正整數ui vi wi fi,表示第i條有向邊從ui出發,到達vi...

網路流 最大流問題

簡單來說,就是在有向網路圖中,單位時間內,從開始點到結束點能通過的最大流量 許多應用都包含了流量問題,例如,公路系統中有車輛流,控制系統中有資訊流,供水系統中有水流,金融系統中有現金流等等 1 源點 出發點。2 匯點 結束點。3 流 就是一條可以從源點到匯點的一條合法路徑。4 容量 每條邊都有乙個容...

網路流之最大流問題

網路流的三個性質 1 容量限制 f u,v c u,v 2 反對稱性 f u,v f v,u 3 流量平衡 對於不是源點也不是匯點的任意結點,流入該結點的流量和等於流出該結點的流量和。只要滿足這三個性質,就是乙個合法的網路流.最大流問題,就是求在滿足網路流性質的情況下,源點 s 到匯點 t 的最大流...