1. 程式人生 > >上下界網絡流

上下界網絡流

但是 容量 log 圖片 tps cnblogs mage 繼續 運用

上下界網絡流,顧名思義,就是每條邊容量有上下界的網絡流問題。針對這種較高級別的網絡流大致分為以下幾個問題:

無源匯上下界可行流

由於沒有固定的源點和匯點,也不存在什麽最大/小流之說了。存在可行流的條件是所有點均滿足流量平衡性質。流量平衡指的是,對於每個點入流量=出流量。

如果每條邊只有上界,沒有下界,那只要讓每條邊的流量均為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)的剩余流量就是原圖的最小流。(感性理解:先跑一次最大流把流量盡可能跑完,剩下的流量就是最小流。)

模板

上下界網絡流