[問題描述]如圖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的流 殘留網路 容量網路 流量網路 這個等式是始終成立的 殘留值當流量值為負時甚至會大於容量值 流量值為什麼會為負?有正必有負,記住斜對稱性 最短路徑增廣演算法 增廣路方法是很多網路流演算法的基礎 ...