網路流演算法

2021-04-27 01:36:55 字數 2501 閱讀 7201

[問題描述]如圖4-1所示是聯結某產品地v1和銷售地v4的交通網,每一弧(vi,vj)代表從vi到vj的運輸線,產品經這條弧由vi輸送到vj,弧旁的數表示這條運輸線的最大通過能力。產品經過交通網從v1到v4。現在要求制定乙個運輸方案使從v1到v4的產品數量最多。

圖 4 - 1

圖 4 - 2

一、基本概念及相關定理1)網路與網路流

定義1給乙個有向圖n=(v,e),在v中指定一點,稱為源點(記為vs,和另一點,稱為匯點(記為vt),其餘的點叫中間點,

對於e中每條弧(vi,vj)都對應乙個正整數c(vi,vj)≥o(或簡寫成cij),稱為f的容量,則賦權有向圖n=(v,e,c,vs,vt)稱為乙個網路。如圖4-1所給出的乙個賦權有向圖n就是乙個網路,指定v1是源點,v4為匯點,弧旁的數字為cij。

所謂網路上的流,是指定義在弧集合e上乙個函式f=,並稱f(vi,vj)為弧(vi,vj)上的流量(下面簡記為fij)。如圖4-2所示的網路n,弧上兩個數,第乙個數表示容量cij,第二個數表示流量fij。

2)可行流與最大流

在運輸網路的實際問題中,我們可以看出,對於流有兩個顯然的要求:一是每個弧上的流量不能超過該弧的最大通過能力(即弧的容量);二是中間點的流量為0,源點的淨流出量和匯點的淨流入量必相等且為這個方案的總輸送量。因此有:

定義2滿足下列條件

(1)容量約束:0≤fij≤cij,(vi,vj)∈e,

(2)守恆條件

對於中間點:流入量=流出量;對於源點與匯點:源點的淨流出量vs(f)=匯點的淨流入量(-vt(f))

的流f,稱為網路n上的可行流,並將源點s的淨流量稱為流f的流值v(f)。

網路n中流值最大的流f*稱為n的最大流。

3)可增廣路徑

所謂可增廣路徑,是指這條路徑上的流可以修改,通過修改,使得整個網路的流值增大。

定義3設f是乙個可行流,p是從源點s到匯點t的一條路,若p滿足下列條件:

(1)在p上的所有前向弧(vi→vj)都是非飽和弧,即0≤fij

ij (2)在p上的所有後向弧(vi←vj)都是非零弧,即0ij≤cij

則稱p為(關於可行流f的)一條可增廣路徑。

(4)割及其容量

定義4如果a是v的乙個子集,a-=v-a,s∈a,t∈a-,則稱邊集(a,a-)為網路n的乙個割,顯然,若把某一割的弧從網路中丟去,則從vs到vt就不存在路。所以直觀上講,割是從vi到vj的必經之道。

定義5給一割(a,a-),把其中所有弧的容量之和稱為這個割的容量,記為c(a,a-),即

c(a,a-)=∑c(e)

網路n中容量最小的割(a*,a*

-)稱為n的最小割。

不難證明,任何乙個可行流的流量v(f)都不會超過任一割的容量,即

v(f)≤c(a,a-)

例如,圖4-2中,若a=,(a,a-)=,c(a,a-)=4+3=7。

(5)有關定理

定理1當且僅當不存在關於f*的增廣路徑,可行流f*為最大流。

證明 必要性:若f*是最大流,設n中存在關於f*的增廣路徑p,令:

q=min

由增廣路徑定義可知,q>0,再令:

f**ij =  f*

ij+q   (vi,vj)∈ p的前向弧的集合

f**ij =  f*

ij-q   (vi,vj)∈ p的後向弧的集合

f**ij =  f*

ij     (vi,vj)不屬於p的集合

不難證明是—可行流,且v(f**)=v(f*)+q>v(f*)。這與f*是最大流假設矛盾,必要性證畢。

證明 充分性:設n中不存在關於f*的增廣路徑,證明f*是最大流。我們利用下面的方法來定義a*。

令vs∈ a*

若vi∈ a*,且fij

ij,則令vj

∈ a*;

若vi∈ a*,且fji>0,則令vj

∈ a*。

因為不存在關於f*的增廣路徑,故vt不屬於a*。

記a*-=v-a*,於是得到乙個割(a*,a*-),顯然有

f*ij=cij,(vi,vj)∈(a*,a*-)

f*ij=0,(vi,vj)∈(a*-,a*)

所以v(f*)=c(a*,a*-)。於是f*必是最大流,定理得證。

由上述證明中可得,若f*是最大流,則網路中必存在乙個割集c(a*,a*-),使得v(f*)=c(a*,a*-)。

於是有以下重要定理。

定理2最大流最小割定理:在乙個網路n中,從vs到vt最大流的容量等於分離vs,vt的最小割的容量。

網路流演算法

ek演算法模板 演算法複雜度 n m m n為點數,m為邊數 源點 1,匯點 n。const int maxn 310,inf 0x7fffffff int pre maxn mat maxn maxn bool vis maxn int n,m int augment else q.push ba...

網路流演算法

網路流演算法 網路流演算法用於解決從源點到匯點最大流的問題。edmonds karp演算法 演算法主要思想 每次bfs找到一條從源點到匯點的最少路徑數的可行路徑,同時把這條路徑塞滿,這條路上的最小容量即為這條路徑的流量。然後將這條路徑的正向邊刪除,增加一條容量相同的反向邊,當bfs無法進行下去的時候...

網路流演算法

看見了一篇非常不錯的博文 1 容量限制 2 流量守恆 3 斜對稱性 x向y流了f的流 y就向x流了 f的流 殘留網路 容量網路 流量網路 這個等式是始終成立的 殘留值當流量值為負時甚至會大於容量值 流量值為什麼會為負?有正必有負,記住斜對稱性 最短路徑增廣演算法 增廣路方法是很多網路流演算法的基礎 ...