上下界網絡流
無源匯上下界可行流
由於沒有固定的源點和匯點,也不存在什麽最大/小流之說了。存在可行流的條件是所有點均滿足流量平衡性質。流量平衡指的是,對於每個點入流量=出流量。
如果每條邊只有上界,沒有下界,那只要讓每條邊的流量均為0,一定存在滿足條件的流,如果有些邊有下界,那就不一定存在滿足條件的流了。
怎麽判斷一張網絡是否存在可行流?
首先我們假設每條邊流量均為它的下界。那麽此時問題就轉化為了一個只有上界的網絡流問題(即普通網絡流問題)。但是這麽做有一個問題:下界不滿足流量平衡。
我們考慮利用剩余的流量去調整以滿足流量平衡。具體來說,如果某個點x的入流大於出流,我們建立一個超級源S‘,建立一條$S‘\rightarrow x$相應容量的邊;反之,如果某個點y的入流小於出流,我們建立一個超級匯T‘,建立一條$y\rightarrow T‘$相應容量的邊。
例如:
此時我們在新圖上跑$S‘\rightarrow T‘$的最大流。由於最大流保證了除源點匯點外其余點均滿足流量平衡,故新圖中除了S‘,T‘其余點均滿足流量平衡,那麽去掉S‘和T‘所連的邊,再加上原先的下界流量,如果滿流則說明滿足流量平衡,原圖必然存在可行流;否則不存在。
模板
怎麽判斷一張有源匯網絡是否存在可行流?
考慮將其轉化為無源匯的問題。
將T向S連一條容量上界為inf,下界為0的邊,那麽如果$T\rightarrow S$這條邊有流量流過,說明原圖是存在可行流的。
有源匯上下界最大流
首先按照上述方法判斷出無解情況。
針對有解情況,顯然當前方案是可行的,但不一定最優。我們將上面所述的新圖刪去S‘,T‘以及它們所連的邊,形成一個流量不平衡的圖(但是這沒關系,因為它和原圖合並後是滿足流量平衡的)。我們在這張圖中繼續增廣(增廣的過程保證是平衡的),即再跑一遍最大流,得到的就是答案。
註意:第二遍的答案就是最終的答案,不用加上第一遍最大流的答案,因為第一遍搜索出來的邊T到S的流量可能是存在的,而第二遍搜索的時候會把這些流彈回去(反向邊的存在),已經包含第一遍的流值了。
模板
有源匯上下界最小流
由於流量有下界,因此是存在非零最小流的。
同樣按照上述方法判斷出無解情況。
註意由於要求流量最小,按照最大流那樣直接增廣是不行的。(感性理解:直接跑求的是最大流,而我要求最小流,顯然文不對題。)
例如:
增廣後的流為200,但是原圖中的最小流為100,這是因為我們沒有運用循環流,也就是$2\rightarrow 1$這條邊。由於我們求的是最小流,所以事實上我們想盡可能多走一些邊。
我們先不加從T到S的邊,直接增廣,如下圖:
然後再加那條邊(註意原先邊的流量還是要保存著的),再增廣一次,此時邊(T,S)的剩余流量就是原圖的最小流。(感性理解:先跑一次最大流把流量盡可能跑完,剩下的流量就是最小流。)
模板
上下界網絡流