無源匯可行流
建模方法:
首先建立乙個源s
s'>ss
ss和乙個匯t
t'>tt
tt,一般稱為附加源和附加匯。
對於圖中的每條弧v>
'>
,假設它容量上界為c
'>c
c,下界b
'>b
b,那麼把這條邊拆為三條只有上界的弧。
一條為,v
>
'>
,容量為b
'>b
b;一條為tt
>
'>
,容量為b
'>b
b;一條為v>
'>
,容量為c−b
'>c−b
c−b。
其中前兩條弧一般稱為附加弧。
然後對這張圖跑最大流,以s
s'>ss
ss為源,以t
t'>tt
tt為匯,如果所有的附加弧都滿流,則原圖有可行流。
這時,每條非附加弧的流量加上它的容量下界,就是原圖中這條弧應該有的流量。
理解方法:
對於原圖中的每條弧,我們把c−b
'>c−b
c−b稱為它的自由流量,意思就是只要它流滿了下界,這些流多少都沒問題。
既然如此,對於每條弧v>
'>
,我們強制給v
'>v
v提供b
'>b
b單位的流量,並且強制從u
'>u
u那裡拿走b
'>b
b單位的流量,這一步對應著兩條附加弧。
如果這一系列強制操作能完成的話,也就是有一組可行流了。
注意:這張圖的最大流只是對應著原圖的一組可行流,而不是原圖的最大或最小流。
有源匯可行流
建模方法:
建立弧s>
'>
,容量下界為0
'>0
0,上界為∞
'>∞
∞。然後對這個新圖(實際上只是比原圖多了一條邊)按照無源匯可行流的方法建模,如果所有附加弧滿流,則存在可行流。
求原圖中每條邊對應的實際流量的方法,同無源匯可行流,只是忽略掉弧s>
'>
就好。而且這時候弧s>
'>
的流量就是原圖的總流量。
理解方法:
有源匯相比無源匯的不同就在於,源和匯是不滿足流量平衡的,那麼連線s>
'>
之後,源和匯也滿足了流量平衡,就可以直接按照無源匯的方式建模。
注意:這張圖的最大流只是對應著原圖的一組可行流,而不是原圖的最大或最小流。
有源匯最大流
建模方法:
首先按照有源匯可行流的方法建模,如果不存在可行流,更別提什麼最大流了。
如果存在可行流,那麼在執行過有源匯可行流的圖上(就是已經存在流量的那張圖,流量不要清零),跑一遍從s
'>s
s到t'>t
t的最大流(這裡的s
'>s
s和t'>t
t是原圖的源和匯,不是附加源和附加匯),就是原圖的最大流。
理解方法:
為什麼要在那個已經有了流量的圖上跑最大流?因為那張圖保證了每條弧的容量下界,在這張圖上跑最大流,實際上就是在容量下界全部滿足的前提下盡量多得獲得「自由流量」。
注意,在這張已經存在流量的圖上,弧s>
'>
也是存在流量的,千萬不要忽略這條弧。因為它的相反弧t>
'>
的流量為s>
'>
的流量的相反數,且t>
'>
的容量為0,所以這部分的流量也是會被算上的。
有源匯最小流
有源匯最小流的常見建模方法比較多,我就只說我常用的一種。
建模方法:
首先按照有源匯可行流的方法建模,但是不要建立s>
'>
這條弧。
然後在這個圖上,跑從附加源s
s'>ss
ss到附加匯t
t'>tt
tt的最大流。
這時候再新增弧s>
'>
,下界為0
'>0
0,上界為∞
'>∞
∞。在現在的這張圖上,從s
s'>ss
ss到t
t'>tt
tt的最大流,就是原圖的最小流。
理解方法:
我們前面提到過,有源匯可行流的流量只是對應一組可行流,並不是最大或者最小流。
並且在跑完有源匯可行流之後,弧s>
'>
的流量就是原圖的流量。
從這個角度入手,我們想讓弧s>
'>
的流量盡量小,就要盡量多的消耗掉那些「本來不需要經過s>
'>
」的流量。
於是我們在新增s>
'>
之前,跑一遍從s
s'>ss
ss到t
t'>tt
tt的最大流,就能盡量多的消耗那些流量啦qwq。
有上下界網路流
前言 下面寫得只是一些十分基礎的東西,是給我以後自己看的,想要徹底弄明白這個內容,推薦去看liu runda。注 為了方便,下面所有的 x,y,l,r 都表示一條從x連向y,流量下界為l,流量上界為r的邊。問題簡述 給出乙個有向圖,每條邊有流量上下界,沒有源點和匯點,要求找到一種流的方法,使得每個點...
教程 上下界網路流建模方法總結
前言 之前學習上下界網路流的時候,花了很多時間去理解建模的方式和原理,然而今天覆習的時候發現忘得差不多了qwq。於是參考了一下以前的 再次做了個總結,放在部落格裡,省得以後忘掉qwq。無源匯可行流 建模方法 首先建立乙個源 ss 和乙個匯 tt 一般稱為附加源和附加匯。對於圖中的每條弧 假設它容量上...
有上下界的網路流
有上下界的網路流 這幾天看了周源的 一種簡易的方法求解流量有上下界的網路中網路流問題 並完成了 sgu 194 zoj 2314 reactor cooling,sgu 176 flow construction 和hoj 2135 poj 2396 budget三道題。作為周源文章中提到的求解上下...