1流網路。流網路g=(v,e)是乙個有向圖,每條邊$(u,v)\in e$有乙個非負容量值$c(u,v)\geq 0$.如果$(u,v)\notin e,c(u,v)=0$.另外有乙個源節點s和匯點t。
2流。g中的流是乙個實值函式$f:v\times v\rightarrow r$,滿足:
(1)容量限制:對所有的$u,v\in v$,$0 \leq f(u,v)\leq c(u,v)$
(2)流量守恆:對所有的$u\in v-\$,滿足$\sum_f(v,u)=\sum_f(u,v)$
乙個流$f$的值$|f|$的定義為:$|f|=\sum_f(s,v)-\sum_f(v,s)$。一般來說,乙個流網路不會有任何進入源點的邊,因此一般$\sum_f(v,s)=0$。
最大流要解決的問題是給定流網路g以及s、t,希望找到值最大的乙個流$f$。
3殘存網路。給定流網路g以及它的乙個流$|f|$,殘存網路$g_$的頂點集邊集以及源點匯點都與原流網路相同,$g_$的邊集的容量定義為:
$c_(u,v)=\left\c(u,v)-f(u,v) &(u,v)\in e\\ f(v,u) & (v,u)\in e\\ 0 & other \end\right.$
4若求得殘存網路$g_$的乙個流$f^$,那麼$f+f^$為$f^$對$f$的遞增,
$(f+f^)(u,v)=\left\f(u,v)+f^(u,v)-f^(v,u) & (u,v)\in e\\ 0& other \end\right.$
$f+f^$也是g的乙個流, $|f+f^|=|f|+|f^|$
5增廣路徑。對於流網路g和流$|f|$,增廣路徑$p$是殘存網路$g_$的一條從s到t的簡單路徑。增廣路徑$p$上能夠增加的流量的最大值為$p$的殘存容量$c_(p)=min\(u,v):(u,v)\in p\}$.定義函式$f_:v \times v\rightarrow r$:
$f_(u,v)=\left\c_(p) & (u,v)\in p \\ 0 & otherwise \end\right.$
$f_$是$g_$的乙個流,$|f_|=c_(p)>0$,$|f+f_|=|f|+|f_|>|f|$
6流網路的切割。流網路g的乙個切割$(s,t)$將頂點集合$v$劃分為$s$和$t=v-s$,滿足$s\in s,t\in t$。若$f$是乙個流,那麼切割$(s,t)$的淨流量$f(s,t)$定義為:
$f(s,t)=\sum_\sum_f(u,v)-\sum_\sum_f(v,u)$
切割$(s,t)$的容量定義為:$c(s,t)=\sum_\sum_c(u,v)$
7設$f$為流網路g的乙個流,源點s,匯點t,設 $(s,t)$為g的任意切割,則橫跨切割$(s,t)$的淨流量$f(s,t)=|f|$
8流網路g的任意流$f$的值不能超過g任意切割的容量。(容量的定義在6中)
$|f|=f(s,t)=\sum_\sum_f(u,v)-\sum_\sum_f(v,u)$
$\leq \sum_\sum_f(u,v)$
$\leq \sum_\sum_c(u,v)$
$=c(s,t)$
9最大流最小切割定理。設$f$為流網路g的乙個流,下面的條件等價:
(1)$f$是g的乙個最大流
(2)殘存網路$g_$不包括任何增廣路徑
(3)|f|=c(s,t),其中$(s,t)$是某個切割。
以下為證明
4的證明:
(1) $0\leq (f+f^)(u,v) \leq c(u,v)$
有乙個前提是$f^(v,u)\leq c_(u,v)=f(u,v)$
$(f+f^)(u,v)$
$=f(u,v)+f^(u,v)-f^(v,u)$
$\geq f(u,v)+f^(u,v)-f(v,u)$
$=f^(u,v)\geq 0$
$(f+f^)(u,v)$
$=f(u,v)+f^(u,v)-f^(v,u)$
$\leq f(u,v)+f^(u,v)$
$\leq f(u,v)+c_(u,v)$
$= f(u,v)+c(u,v)-f(u,v)$
$=c(u,v)$
(2)對所有的$u\in v-\$,滿足$\sum_(f+f^)(u,v)=\sum_(f+f^)(v,u)$
$\sum_(f+f^)(u,v)$
$=\sum_(f(u,v)+f^(u,v)-f^(v,u))$
$=\sum_(f(u,v))+\sum_f^(u,v)-\sum_f^(v,u)$
$=\sum_(f(v,u)+f^(v,u)-f^(v,u))$
$=\sum_(f+f^)(v,u)$
(3)$|f+f^|=|f|+|f^|$。我們假設g沒有反平行邊,即若$(u,v)\in e$那麼$(v,u)\notin e$(如果g存在反平行邊,假設是$(u,v)$,我們可以增加乙個節點$w$ 和兩條邊$(u,w),(w,v)$來消除反平行邊)。現在定義$v_=\$,$v_=\$,那麼有$v_\cap v_=\phi $
$|f+f^|=\sum_(f+f^)(s,v)-\sum_(f+f^)(v,s)$
$=\sum_}(f+f^)(s,v)-\sum_}(f+f^)(v,s)$
$=\sum_}(f(s,v)+f^(s,v)-f^(v,s))-\sum_}(f(v,s)+f^(v,s)-f^(s,v))$
$=\sum_}f(s,v)-\sum_}f(v,s)+\sum_\cup v_}f^(s,v)-\sum_\cup v_}f^(v,s)$
$=\sum_f(s,v)-\sum_f(v,s)+\sum_f^(s,v)-\sum_f^(v,s)$
$=|f|+|f^|$
7的證明
首先由流量守恆,對任意$u\in v-\$,$\sum_f(u,v)-sum_f(v,u)=0$
$|f|=\sum_f(s,v)-\sum_f(v,s)$
$=\sum_f(s,v)-\sum_f(v,s)+\sum_}(\sum_f(u,v)-\sum_f(v,u))$
$=\sum_f(s,v)-\sum_f(v,s)+\sum_}\sum_f(u,v)-\sum_}\sum_f(v,u)$
$=\sum_(f(s,v)+\sum_}f(u,v))-\sum_(f(v,s)+\sum_}f(v,u))$
$=\sum_\sum_f(u,v)-\sum_\sum_f(v,u)$
將v分解為$s$和$t=v-s$
$|f|=\sum_\sum_f(u,v)+\sum_\sum_f(u,v)$
$-\sum_\sum_f(v,u)-\sum_\sum_f(v,u)$
$=\sum_\sum_f(u,v)-\sum_\sum_f(v,u)$
$=f(s,t)$
9的證明
$(1)\rightarrow (2)$假設$f$是g的乙個最大流,但是$g_$中還有一條增廣路徑$p$,那麼由5可得加上$p$之後可以得到乙個嚴格大於$|f|$的流,這與$f$是最大流矛盾。
$(2)\rightarrow (3)$定義$s=\中存在一條從s到v的路徑\}$,$t=v-s$,首先$s\in s$。由於$g_$中不存在增廣路徑,所以不存在s到t的路徑,所以$t\notin s$。所以$(s,t)$是g的乙個切割。現在考慮一對節點$u\in s,v\in t$如果$(u,v)\in e$,必有$f(u,v)=c(u,v)$,否則邊$(u,v)$將把$v$置於集合$s$;如果$(v,u)\in e$,必有$f(v,u)=0$,否則$c_(u,v)=f(v,u)>0$,這使邊$(u,v)\in e_$,從而使得$v\in s$,所以
$|f|=f(s,t)=\sum_\sum_f(u,v)-\sum_\sum_f(v,u)$
$=\sum_\sum_c(u,v)-\sum_\sum_0$
$=c(s,t)$
$(3)\rightarrow (1)$ 根據8,對所有的切割$(s,t)$,$|f|\leq c(s,t)$,所有若$|f|=c(s,t)$,那麼$f$是乙個最大流
最大流 學習筆記
這裡總結一下幾種最大流演算法 ek演算法應該是最大流中最簡單的了,但剛開始理解也花了不少工夫 ek演算法基於增廣路。它的思想是,每一次通過bfs不停尋找增廣路,找到以後增廣,直到找不到為止 殘量 一條邊的殘量等於該邊的容量減去該邊當前的流量,為了方便,我們可以建立殘量網路。這樣每條邊只需要對應乙個權...
最大流學習筆記(2)
1 基本的ford fulkerson方法。該方法的思想就是每次找到乙個增廣路 p 然後將增廣路 p 對應的流加到之前的流上得到新的流,一直這樣直到找不到增廣路,這時候找到的流就是最大流。演算法的偽 如下 假設容量是整數,最大流為 f 那麼while迴圈最多執行 f 次,因為每次至少使得流量增加1,...
最大流學習筆記(2)
1 基本的ford fulkerson方法。該方法的思想就是每次找到乙個增廣路 p 然後將增廣路 p 對應的流加到之前的流上得到新的流,一直這樣直到找不到增廣路,這時候找到的流就是最大流。演算法的偽 如下 假設容量是整數,最大流為 f 那麼while迴圈最多執行 f 次,因為每次至少使得流量增加1,...