最大流標號法:
最大流的標號法總的來說就是不斷地在圖中找增廣路徑。增廣路徑就是一條從源點到匯點的路徑,所有前向邊都是非飽和邊,反向邊都是非零邊
在這節中,我將描述一種構造所有增廣路徑演算法的方法,這種方法是由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,連續最短增廣路演算法 在最短增廣路演算法的基礎上改造 ...