最大流的Ford Fulkerson 標號法

2021-08-11 18:13:03 字數 2048 閱讀 1748

最大流標號法:

最大流的標號法總的來說就是不斷地在圖中找增廣路徑。增廣路徑就是一條從源點到匯點的路徑,所有前向邊都是非飽和邊,反向邊都是非零邊

在這節中,我將描述一種構造所有增廣路徑演算法的方法,這種方法是由ford and fulkerson在2023年發明的。

增廣路徑是找出在殘留網路中從源點到匯點的有向路徑。增廣路徑的殘留容量是路徑中任意邊所形成的最小殘留容量。顯然,我們可以沿著增廣路徑從源點到匯點傳送額外的流。

假如有這麼一條路,這條路從源點開始一直一段一段的連到了匯點,並且,這條路上的每一段都滿足流量 < 容量。那麼,我們一定能找到這條路上的每一段的(容量-流量)的值當中的最小值delta。我們把這條路上每一段的流量都加上這個delta,一定可以保證這個流依然是可行流。這樣我們就得到了乙個更大的流,他的流量是之前的流量+delta,而這條路就叫做增廣路徑。

所有的增廣路徑演算法的構造是基於增廣路徑定理的:

定理一(增廣路徑定理):流x是最大流當且僅當這個殘留網路不包含其他增廣路經。

由這個定理我們得到一種找到最大流的方法。這種方法通過在所有路徑中不斷地找出增廣路徑和增廣流,直到網路中不在包含這樣的路徑。我們要討論的一些演算法,它們所不不同的只是尋找增廣路徑的方法。

我們認為最大流問題基於以下假設:

假設一:這個流網路是乙個有向網。

假設二:網路中的所有容量都是非負整數。

附註:這個假設對於某些演算法不是必須的,這些演算法的複雜邊界涉及到資料的完整性。

假設三:這個問題有乙個最佳解決方案,且這個方案是有界的

。附註:這個特定的假設意味著從源點到匯點是有容量限制的路徑。

假設四:這個網中不包含平行的弧。

附註:這個假設的規定不失一般性,因為我們可以總結出所有平行弧的容量。

兩個while迴圈,內部的while迴圈就是在當前的殘餘網路種找增廣路徑,外部的while就是在每找到一條增廣路徑後,就更新圖,然後繼續找

#include #include #include #include using namespace std;

#define maxn 10010

#define inf 0xfffffff

struct arctype

;arctype edge[maxn][maxn];

int n,m;//頂點數、弧數

int flag[maxn];//頂點狀態:-1——未標號;0——已標號未檢查;1——已標號已檢查

int pre[maxn];//標號的第乙個分量:指明標號從哪個頂點而來,以便找出可改進量

int alpha[maxn];//標號的第二個分量:可改進量α

int que[maxn];//相當於bfs中的佇列

int v;//佇列頭元素

int qs,qe;//隊首隊尾的位置

int i,j;

void ford()//標號法求網路最大流

else if(edge[i][v].c0)//反向且有流量,這裡的反向是相對於bfs的順序來的,對於所有沒有被遍歷的點i,bfs所在層都比現在的點v低,那麼i->v就是反向邊了

}flag[v]=1;//標記頂點i已經檢查

}if(flag[n-1]==-1||alpha[n-1]==0) break;//匯點無標號或匯點的調整量為0

int k1=n-1,k2=abs(pre[k1]);

int a=alpha[n-1];//可改進量α

while(1) //將這條增廣路徑上的邊都減去流到n-1的流量

ford();

return 0;}/*

6 10

0 1 8 0

0 2 4 0

1 3 2 0

1 4 2 0

2 1 4 0

2 3 1 0

2 4 4 0

3 4 6 0

3 5 9 0

4 5 7 0

*/

4 5

0 1 4 4

0 2 3 0

1 2 2 2

1 3 4 2

2 3 2 2

有反向邊的測試資料

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

網路最大流

1,一般增廣路演算法 採取標號法每次在容量網路中尋找一條增廣路進行增廣,直至不存在增廣路為止。增廣路方法 2,最短增廣路演算法 每個階段 在層次網路中,不斷用bfs演算法進行增廣直到 不存在增廣路為止。如果匯點不在層次網路中,則演算法中 止。3,連續最短增廣路演算法 在最短增廣路演算法的基礎上改造 ...