前言
之前學習上下界網絡流的時候,花了很多時間去理解建模的方式和原理,然而今天復習的時候發現忘得差不多了QwQ。於是參考了一下以前的代碼,再次做了個總結,放在博客里,省得以后忘掉QwQ。
無源匯可行流
建模方法:
首先建立一個源$ss$和一個匯$tt$,一般稱為附加源和附加匯。
對於圖中的每條弧$<u,v>$,假設它容量上界為$c$,下界$b$,那么把這條邊拆為三條只有上界的弧。
一條為$<ss,v>$,容量為$b$;
一條為$<u,tt>$,容量為$b$;
一條為$<u,v>$,容量為$c-b$。
其中前兩條弧一般稱為附加弧。
然后對這張圖跑最大流,以$ss$為源,以$tt$為匯,如果所有的附加弧都滿流,則原圖有可行流。
這時,每條非附加弧的流量加上它的容量下界,就是原圖中這條弧應該有的流量。
理解方法:
對於原圖中的每條弧,我們把$c-b$稱為它的自由流量,意思就是只要它流滿了下界,這些流多少都沒問題。
既然如此,對於每條弧$<u,v>$,我們強制給$v$提供$b$單位的流量,並且強制從$u$那里拿走$b$單位的流量,這一步對應着兩條附加弧。
如果這一系列強制操作能完成的話,也就是有一組可行流了。
注意:這張圖的最大流只是對應着原圖的一組可行流,而不是原圖的最大或最小流。
有源匯可行流
建模方法:
建立弧$<t,s>$,容量下界為$0$,上界為$\infty$。
然后對這個新圖(實際上只是比原圖多了一條邊)按照無源匯可行流的方法建模,如果所有附加弧滿流,則存在可行流。
求原圖中每條邊對應的實際流量的方法,同無源匯可行流,只是忽略掉弧$<t,s>$就好。
而且這時候弧$<t,s>$的流量就是原圖的總流量。
理解方法:
有源匯相比無源匯的不同就在於,源和匯是不滿足流量平衡的,那么連接$<t,s>$之后,源和匯也滿足了流量平衡,就可以直接按照無源匯的方式建模。
注意:這張圖的最大流只是對應着原圖的一組可行流,而不是原圖的最大或最小流。
有源匯最大流
建模方法:
首先按照有源匯可行流的方法建模,如果不存在可行流,更別提什么最大流了。
如果存在可行流,那么在運行過有源匯可行流的圖上(就是已經存在流量的那張圖,流量不要清零),跑一遍從$s$到$t$的最大流(這里的$s$和$t$是原圖的源和匯,不是附加源和附加匯),就是原圖的最大流。
理解方法:
為什么要在那個已經有了流量的圖上跑最大流?因為那張圖保證了每條弧的容量下界,在這張圖上跑最大流,實際上就是在容量下界全部滿足的前提下盡量多得獲得“自由流量”。
注意,在這張已經存在流量的圖上,弧$<t,s>$也是存在流量的,千萬不要忽略這條弧。因為它的相反弧$<s,t>$的流量為$<t,s>$的流量的相反數,且$<s,t>$的容量為0,所以這部分的流量也是會被算上的。
有源匯最小流
有源匯最小流的常見建模方法比較多,我就只說我常用的一種。
建模方法:
首先按照有源匯可行流的方法建模,但是不要建立$<t,s>$這條弧。
然后在這個圖上,跑從附加源$ss$到附加匯$tt$的最大流。
這時候再添加弧$<t,s>$,下界為$0$,上界為$\infty$。
在現在的這張圖上,從$ss$到$tt$的最大流,就是原圖的最小流。
理解方法:
我們前面提到過,有源匯可行流的流量只是對應一組可行流,並不是最大或者最小流。
並且在跑完有源匯可行流之后,弧$<t,s>$的流量就是原圖的流量。
從這個角度入手,我們想讓弧$<t,s>$的流量盡量小,就要盡量多的消耗掉那些“本來不需要經過$<t,s>$”的流量。
於是我們在添加$<t,s>$之前,跑一遍從$ss$到$tt$的最大流,就能盡量多的消耗那些流量啦QwQ。
總結
口胡完畢。
我姿勢水平不高,沒見過什么上下界網絡流的題(或許真的不常考?),唯一見過的一道就放上來叭QwQ。
題目與題解
Inspection LA 4597 NEERC 2009
題解還請看我的博客QwQ:http://www.cnblogs.com/mlystdcall/p/6734979.html