流網路g=(v,e)是乙個有向圖,其中每條邊(u,v)∈e均有乙個非負能量c(u,v)≥0。如果(u,v)∉e,則假定c(u,v)=0。流網路中有兩個特點的頂點,源點s和匯點t,假定每個頂點均處於從源點到匯點的某條路徑上,就是說,對每個頂點v∈v,存在一條路徑s->v->t,因此圖g是連通圖,且|e|≥|v|-1。
設g=(v,e)是乙個流網路,其能量函式為c。設s為網路的源點,t為匯點。g的流是乙個實值函式f:vxv->r,且滿足下列三個性質:
容量限制:對所有u,v∈v,要求f(u,v)≤c(u,v)
反對稱性:對所有u,v∈v,要求f(u,v)=-f(v,u)
容量限制性質說明從乙個頂點到另乙個頂點的網路流不能超過設定的容量;反對稱性說明從頂點u到頂點v的流是其反向流求負所得。流手恒性說明從非源頂點或非匯點的頂點出發的總網路流為0。
最大流問題,就是給出乙個具有源點s和匯點t的流網路g,希望找出從s到t的最大值流。
頂點總的淨流量:離開頂點的總的正流量,減去進入頂點的總的正流量。流守恆性的另乙個說法,進入某個非源點非匯點的頂點的正網路流,必須等於離開該頂點的正網路流,即流進等於流出。注意是正網路流。
存在多個源點和匯點的最大流問題中,將建立超級源點和超級匯點。
流函式f以流網路中的兩個頂點作為自變數,並隱含求和記號的數學定義如下:
設g=(v,e)是乙個流網路,f是g中的乙個流:
對所有x⊆v,f(x,x)=0
對所有x,y⊆v,f(x,y)=-f(y,x)
對所有x,y,z⊆v,其中x∩y=∅,有f(xuy,z)=f(x,z)+f(y,z)且f(z,xuy)=f(z,x)+f(z,y)
應用隱含求和記法,可以證明乙個流的值為進入匯點的全部網路流:
|f|=f(v,t),根據流守恆性,對所有頂點(非源點非匯點),進入頂點的總的正流量等於離開頂點的總的正流量。根據上面的數學定義,證明:
|f|=f(s,v)
=f(v,v)-f(v-s,v)
=-f(v-s,v)
=f(v,v-s)
=f(v,t)+f(v,v-s-t)
=f(v,t)
1)ford-fulkerson方法
ford-fulkerson方法用流網路的割求解最大流的值,依賴三個主要思想:殘留網路、增廣路徑、割。
ø 殘留網路形式化定義
假定乙個流網路g=(v,e),源點為s,匯點為t;設f是g中的乙個流,並考察一對頂點u,v∈v,在不超過容量c(u,v)的條件下,從u到v之間可以壓入的額外網路流量,就是(u,v)的殘留容量,定義為:cf(u,v)=c(u,v)-f(u,v)。
如果c(u,v)=16且f(u,v)=11,那麼在不超過16的情況下,可以在增加cf(u,v)=5的流來增加f(u,v)。
給定乙個流網路g=(v,e)和流f,由f壓得的g的殘留網路gf=(v,ef),其中:
ef=在殘留網路中,每條殘留邊都能夠容納乙個嚴格為正的網路流。ef中的邊可以是e中的也可以是反向邊。在f(u,v)<0情況下,即反向變邊,ef中的邊不在e中。
設g=(v,e)是源點為s、匯點為t的乙個流網路,且f為g中的乙個流。設gf是由f匯出的g的殘留網路,且f』為gf中的乙個流。那麼f+f』之和也是g中的乙個流,|f+f』|=|f|+|f』|。
ø 增廣路徑的形式化定義
已知乙個流網路g=(v,e)和流f,增廣路徑p為殘留網路gf中從s到t的一條簡單路徑。
沿一條增廣路徑p的每條邊傳輸的網路流的最大量為p的殘留容量,定義為:
cf(p)=min
設g=(v,e)是乙個流網路,f是g的乙個流,並設p是殘留網路gf中的一條增廣路徑,定義函式:
則fp是gf上的乙個流,其值為|fp|= cf(p)>0。
設g=(v,e)是乙個流網路,f是g的乙個流,p是殘留網路gf中的一條增廣路徑。fp定義如上, f』=f+fp也是g的乙個流,值|f』|=|f|+|fp|>|f|。
通俗地理解殘留網路和增廣路徑:在流網路的乙個流f上還可以容納的多餘的流量就是殘留網路,而在殘留網路中尋找最大流就是增廣路徑,原來流f加上殘留網路中的增廣路徑流就是不斷增加了最大流的值,如此迭代,尋找最大流的值。
ø 流網路的割形式化定義
ford-fulkerson方法沿著增廣路徑反覆增加流,直至找到最大流為止。最大流最小割原理是:乙個流使最大流,當且僅當它的殘留網路不包含增廣路徑。
流網路g=(v,e)的割(s,t)是將頂點集合v劃分為s和t=v-s兩部分,使得s∈s,t∈t。如果f是乙個流,則穿過(s,t)的淨流定義為f(s,t),割(s,t)的容量為c(s,t)。乙個網路的最小割也是網路中所有割中具有最小容量的割。
設f是源點s、匯點t的流網路g中的乙個流,並且(s,t)是g的乙個割,則通過割(s,t)的淨流f(s,t)=|f|,即乙個流的值為進入匯點的總網路流量。
網路的最大流必定不超過此網路最小割的容量,最大流的值實際上就是某乙個最小割的容量。
這個很好理解了,就是關鍵割了,最大值取決於關鍵路徑上的容量。
有了上面三個形式化定義,現在可以正式說明最大流最小割定理。
如果f是具有源點s和匯點t的流網路g=(v,e)中的乙個流,則下列條件是等價的:
第一:f是g的乙個最大流;
第二:殘留網路gf不包含增廣路徑;(迭代再也找不到增廣路徑)
第三:對g的某個割(s,t),有|f|=c(s,t);(最大流是最小割的容量)
對ford-fulkerson方法的演算法分析以及通過最短路徑距離定義優化的edmonds-karp演算法不多述。理解最大流最小割原理最重要是理解流的定義。
ford-fulkerson方法的基礎演算法中關鍵是增廣路徑的尋找,這也是決定演算法效能的關鍵點。
2)最大二分匹配
流網路的流滿足容量限制、反對稱性、流守恆性三大性質,基於殘留網路、流網路割以及增廣路徑的定義,形成最大流的最小割容量值定理。
最大二分匹配正式在這樣基礎上,用以解決二分圖匹配問題。可以說是將二分匹配問題轉化為最大流問題,也可以說是最大流問題適合用於解決二分匹配問題,anyway,先看看二分匹配問題的定義。
給定乙個無向圖g=(v,e),乙個匹配是乙個邊的子集m⊆e,且滿足對所有頂點v∈v,m中至多有一條邊和v關聯。如果m中某條邊和v關聯,則說頂點v∈v被匹配,否則是無匹配。最大匹配就是最大勢的匹配。假定頂點集合可被劃分為v=lur,其中l和r是不相交的,且e中的所有邊乙個端點在r中、另乙個端點在l中,並假設v中的每個頂點至少有一條關聯的邊。基於這樣的二分圖定義尋找最大匹配問題有很多實際應用。如集群機器執行分布式任務,機器是集合l,任務是集合r,e中的邊(u,v)假設為u∈l的機器執行一項任務v∈r,最大匹配可以將任務盡可能多地分配給機器執行。
應用ford-fulkerson方法可以在關於|v|和|e|的多項式時間內,找出無向二分圖g=(v,e)的最大匹配。針對二分圖建立乙個流網路,流對應於匹配,尋找最大匹配就是尋找最大流。定義下二分圖g的相應流網路g1=(v1,e1):
設源點s和匯點t是不屬於v的新頂點,v1=vu,如果g的頂點劃分為v=lur,g1的有向邊為e的邊,從l指向r,再加上|v|條新邊:
e1=uu
v中的每個頂點至少有一條關聯邊,|e|≥|v|/2。
設g=(v,e)是乙個二分圖,其頂點劃分為v=lur,設g1=(v1,e1)是g對應的流網路。如果m是g的匹配,則g1中存在乙個整數值的流f,且|f|=|m|,相反,如果f是g1中的整數值流,則g中存在一匹配m滿足|m|=|f|。二分圖g的乙個最大匹配m的勢等於其相應的流網路g1中的某一最大流的值。
演算法導論還就最大流給出了壓入與重標記演算法以及優化的重標記與前移演算法,值得去深入理解。在理解最大流及其應用上,還是有點脫離實際,所以暫不深入掌握這兩個演算法。
演算法導論 最大流 Push Relabel
include include include 圖節點 typedef struct vertexnode vertex,pvertex 圖 typedef struct graph,pgraph 根據演算法導論 圖26 6初始化圖 pgraph initgraph for int i 0 ivn ...
演算法導論 最大流 Edmonds Karp演算法
華電北風吹 天津大學認知計算與應用重點實驗室 2016 07 20 有向圖的最大流演算法 模板。利用廣度優先搜尋尋找殘量網路增廣路。include include include using namespace std define maxn 10 define int min 0x80000000...
網路流之最大流
網路流之最大流 一 問題引入。有n個排水口,不同的排水口之間有m條水管連線,水一開始從源點s流出,最終到達t。每條邊 水管 都有乙個最大的流量。除了s,t外,每個排水口的流入量都要等於流出量,詢問最多能有多少水到達終點t 如圖所示 即poj 1273 可以將問題進行如下整理 1 用c e 表示每條邊...