有上下界限制的網路流 總結

2022-04-06 16:39:25 字數 3415 閱讀 6416

給定乙個網路,乙個加權的有向圖g,其中的每條邊都有乙個容量上界c。其中的兩點:s只有出度沒有入度,t只有入度沒有出度。求s到t最大可以流過的流量,這是最大流的模型。

且滿足以下條件:

那麼f是g的乙個可行流。最大流即滿足容量限制和流量平衡的最大的流。

如果在網路中,每條邊增加乙個流量下界b,這就是有上下界限制的網路流的模型了。

那麼有上下界限制的網路流也是滿足兩個條件:

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

下面分別闡述其求法

b(u,v): u->v的流量下界

c(u,v): u->v的流量上界

f(u,v): u->v的流量

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

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

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

$\sum\limits_b(u,i) \neq \sum\limits_b(i,v)$

$\sum\limits_[b(u,i)+g(u,i)] = \sum\limits_[b(i,v)+g(i,v)]-----(1)$

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

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

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

將(1)式移項:

$\sum\limits_b(u,i)-\sum\limits_b(i,v) = \sum\limits_g(i,v) - \sum\limits_g(u,i)$

令$m(i) = \sum\limits_b(u,i)-\sum\limits_b(i,v)$

原式:$m(i) = \sum\limits_g(i,v) - \sum\limits_g(u,i)$

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

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

$\sum\limits_g(i,v) = \sum\limits_g(u,i)+ m(i)$

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

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

$\sum\limits_g(i,v) - m(i) = \sum\limits_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. 有源匯有上下界最小流

有上下界的網路流總結

參考大佬的部落格 1.無源匯的可行流 可行流演算法的核心是將乙個不滿足流量守恆的初始流調整成滿足流量守恆的流。建圖方法 b u,i 為從u到i的下界,f為實際流 求解 在新圖上跑ss到tt的最大流 如果附加邊滿流就說明可行,如何說明是附加邊滿流 即如果最大流的大小等於ss出發的所有邊的流量上限之和 ...

有上下界網路流

前言 下面寫得只是一些十分基礎的東西,是給我以後自己看的,想要徹底弄明白這個內容,推薦去看liu runda。注 為了方便,下面所有的 x,y,l,r 都表示一條從x連向y,流量下界為l,流量上界為r的邊。問題簡述 給出乙個有向圖,每條邊有流量上下界,沒有源點和匯點,要求找到一種流的方法,使得每個點...

有上下界的網路流

有上下界的網路流 這幾天看了周源的 一種簡易的方法求解流量有上下界的網路中網路流問題 並完成了 sgu 194 zoj 2314 reactor cooling,sgu 176 flow construction 和hoj 2135 poj 2396 budget三道題。作為周源文章中提到的求解上下...