【教程】上下界網絡流建模方法總結


前言

  之前學習上下界網絡流的時候,花了很多時間去理解建模的方式和原理,然而今天復習的時候發現忘得差不多了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

 


免責聲明!

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



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