有上下界限制的網絡流-總結


有上下界限制的網絡流

 

模型


給定一個網絡,一個加權的有向圖G,其中的每條邊都有一個容量上界C。其中的兩點:S只有出度沒有入度,T只有入度沒有出度。求S到T最大可以流過的流量,這是最大流的模型。
且滿足以下條件:

  • 容量限制:每條邊的流量$0\leq f\leq C$ 
  • 流量平衡:任意一個點i,$\sum\limits_{(u,i)\in E}f(u,i) = \sum\limits_{(i,v)\in E}f(i,v)$

那么f是G的一個可行流。最大流即滿足容量限制和流量平衡的最大的流。

如果在網絡中,每條邊增加一個流量下界B,這就是有上下界限制的網絡流的模型了。
那么有上下界限制的網絡流也是滿足兩個條件:

  •  容量限制:每條邊的流量$B\leq f\leq C$
  •  流量平衡:任意一個點i,$\sum\limits_{(u,i)\in E}f(u,i) = \sum\limits_{(i,v)\in E}f(i,v)$

有上下界限制的網絡流一般分為三類:

  •  無源匯有上下界可行流
  •  有源匯有上下界最大流
  •  有源匯有上下界最小流

下面分別闡述其求法

 

預備知識

B(u,v): u->v的流量下界
C(u,v): u->v的流量上界
f(u,v): u->v的流量

 

無源匯上下界可行流

顧名思義,無源匯上下界可行流:沒有源點S,匯點T。在網絡中求可行流或者指出不存在。

對於這個問題,不好處理,但是如果我們去掉流量下界限制B,那么就是最大流的模型了,問題就可以解決了。

 

直接去掉B是不對的。我們規定初始流:每條邊先流過B的流量。但是初始流可能會不滿足流量平衡。即可能存在:

$\sum\limits_{(u,i)\in E}B(u,i) \neq \sum\limits_{(i,v)\in E}B(i,v)$

那么我們加上一個$g$(附加流)是其滿足流量平衡。

$\sum\limits_{(u,i)\in E}[B(u,i)+g(u,i)] = \sum\limits_{(i,v)\in E}[B(i,v)+g(i,v)]-----(1)$

$B + g$ 也就是實際的流量$f$。

此時我們去掉了流量下界限制B,那么網絡中每條邊的容量上界限也要減去,已經流過了B的流量,即新網絡圖中每條邊的流量上界限制為$C' = C - B $,下界限制0。

 

用最大流求解(求解附加流):

將(1)式移項:

$\sum\limits_{(u,i)\in E}B(u,i)-\sum\limits_{(i,v) \in E}B(i,v) = \sum\limits_{(i,v)\in E}g(i,v) - \sum\limits_{(u,i)\in E}g(u,i)$

 $M(i) = \sum\limits_{(u,i)\in E}B(u,i)-\sum\limits_{(i,v) \in E}B(i,v)$ 

原式:

$M(i) = \sum\limits_{(i,v)\in E}g(i,v) - \sum\limits_{(u,i)\in E}g(u,i)$

M(i)是已知的,i點的流入的下界之和減流出的下界之和。

 

1、如果$M(i) \geq 0$

$\sum\limits_{(i,v)\in E}g(i,v) = \sum\limits_{(u,i)\in E}g(u,i)+ M(i)$

那么我們發現附加流中流出的需要比流入的多M(i)才可以達到流量平衡,那么這些流從哪來呢。建一個源點SS,建一條從SS到i的邊,容量為$M(i)$。

2、如果$M(i) \leq 0$

$\sum\limits_{(i,v)\in E}g(i,v) - M(i) = \sum\limits_{(u,i)\in E}g(u,i)$

同理,發現附加流中流入的需要比流出的多M(i)才可以達到流量平衡。建一匯點TT,建一條從i到TT點邊,容量$-M(i)$,容量也就變成正的了。

建圖完畢。從SS到TT跑一遍最大流即可。原圖中存在解的條件是:每條從SS連出的邊與連向TT的邊都需要滿流。

 

 

問題:

1、為什么從SS連出的邊與連向TT的邊滿流后才存在解,不滿流就不存在解?
設從SS連出的邊其中一條指向i,容量M。思考連這條邊是因為a的下界B中流入的(B1)大於流出的(B2)。因為在網絡圖中已經流了下界的流量,所以附加流中i的出邊要增加一些流量,以達到實際網絡圖中的流量平衡。這些增加的流量就是從這條邊流來,如果這條邊未滿流,那么說明i的所有出邊已經無法再流M的流量了,也就是a的所有出邊的流出的最大值,不及入邊的最小值B1,因此不存在解。
相反,如果滿流,那么說明這個點至少是可以達到流量平衡了,且滿足了容量限制,那么所有的邊都滿流,就是有解了。
對於連向TT的邊,同理。

2、還有一個小問題,會不會S到i的邊未滿流,但是另一指向i的邊使a流量平衡了。
但是仔細想一下,這是不可能存在的。最大流從S開始跑,整個圖中的流量都是從S出發的,而對於S出發的指向i的一條邊,它剛好使得i點流量平衡,哪會有多余的流量流給其他點呢?

無源匯上下界網絡流到此求解完成。

例題:SGU 194. Reactor Cooling

 

 

有源匯上下界可行流

 

有源匯上下界可行流相比有源匯上下界可行流,多了源點S和匯點T,求從S到T滿足每條邊的流量都滿足限制,且除S,T,其他點都滿足流量平衡。因為只有S和T不滿足流量平衡,所以,如果可以使S,T也滿足流量平衡,那么就可以直接套用無源匯上下界可行流了。

 

那么具體如何操作呢?

源點的性質是只有流出的沒有流入的,匯點恰好相反,而且對於源點流出的和匯點流入的,這些流量是相等的。所以建一條從T到S的邊容量為INF,那么流入匯點的流量就會從這條邊流入S。有源匯到無源匯轉換完成,跑一遍從SS到TT的最大流即可。可行流的流量也就是這條邊的流量。

 

無源匯上下界可行流到此求解完成。

無源匯上下界可行流沒有例題,因為在下面兩個中都會用到。

 

有源匯上下界最大流

有源匯上下界最大流與有源匯上下界可行流相比,不只是可行流,而且要最大。依然每條邊滿足容量限制,除源點匯點滿足流量平衡。

 

首先,前提是必須有可行流,所以先套用有源匯上下界可行流來判斷是否有解。如果沒解就直接輸出,有解繼續往下看。然后,判斷后的殘量網絡上跑一遍從S到T的最大流,讓還有自由流的邊多流一些,然后將可行流與這次的最大流相加即可。

 

為什么這樣可以求出最大流?

SS連出的所有邊,容量都是流入的下界之和-流出的下界之和,所以當這些邊都滿流時,說明這些點實際流出的流量=流入的下界之和。那么流入的上界可能並沒有達到。對於連向TT的邊同樣是這樣。所以在殘余網絡上,可能可以繼續流一些的,從S到T的最大流,剛好把這些流量全加上。此時再加上可行流,就是最大流。

這樣做會不會不滿足流量限制了?

在原圖中SS,TT的邊已經滿流了,而且最后的最大流,是不經過這些邊的,無法改動這些邊的。

 

代碼實現(兩種方法):

1、判斷可行流,刪除T->S的邊,求S到T的最大流,answer=可行流+最大流。

2、判斷可行流,求S到T的最大流,answer=最大流。仔細一想就明白了,T->S這條邊不可能走,而它的反向邊S->T容量(可行流)是要走的,所以可行流的流量會從S->T增廣到T。

 

還有一種求解的方法:

在判斷可行流時,增加了一條T->S的邊,B=0,C = INF。如果存在可行流,那么T->S這條邊的容量就是可行流的流量,假設這個流量為a。所以,每次我們可以給a一個值,如果存在解,那么說明這個值是可行的,所以二分a,判斷是否可行即可。

 

無源匯上下界最大流到此求解完成。

例題:loj #116. 有源匯有上下界最大流

 

有源匯上下界最小流

這個相比上面就是求最小流了。

 

同樣,先判斷是否有解。之后求一遍T到S的最大流,用可行李減去最大流。考慮反向邊的增加量是表示正向邊的減少量,所以求出從T到S的最大減少量就是最小流了。

代碼實現:判斷可行流,刪T->S的邊,求一遍T到S的最大流,answer=可行流-最大流。

 

無源匯上下界最小流到此求解完成。

例題loj #117. 有源匯有上下界最小流

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM