最大流學習筆記(1)

2021-09-07 23:13:00 字數 4047 閱讀 4314

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,...