網絡流學習筆記(2):最大流問題的各種變體

多源點多匯點

我們已經介紹瞭如何求解恰有一個源點和一個匯點的網絡流。那麼,如果有多個源點和匯點,並且它們都有對應的最大流出容量和流入容量限制時該怎麼做呢?答案很簡單,只要增加一個超級源點 s s 和一個超級匯點 t t ,從 s s 向每個源點連一條容量爲對應最大流出容量的邊,從每個匯點向 t t 連一條容量爲對應最大流入容量的邊。不過,如果源和匯之間存在對應關係(從不同源點流出的流要流入指定的匯點)時,是無法這樣求解的。這種情況被稱爲多物網絡流問題,尚未有已知的高效算法,這類問題也幾乎不會出現在程序設計競賽當中
在這裏插入圖片描述

無向圖的情況

下面來考慮無向圖的情況。此時的容量表示的是兩個方向流量之和的上界。不過,如果兩個方向都有流量,則與它們相互抵消之後是等價的,所以可以知道最大流中沒有必要在兩個方向都有流量。因此把無向圖中容量爲 c的一條邊當作有向圖中兩個方向各有一條容量爲 c的兩條邊,就能夠得到同樣的結果。
在這裏插入圖片描述

頂點有容量限制的情況

圖中不光邊上有容量限制,途中經過的頂點也有總流入量和總流出量的限制的情況應該如何處理呢?此時,我們可以把每個頂點拆成兩個。拆點之後得到入頂點和出頂點,將指向原先頂點的邊改成指向入頂點,將從原先頂點指出的邊改成從出頂點指出。並且,再從入頂點向出頂點連容量爲原先頂點容量的邊,就可以把頂點上的容量限制轉爲邊上的容量限制了。
在這裏插入圖片描述

有最小流量限制的情況

考慮一下不光有最大流量限制 c ( e ) c(e) ,還有最小流量限制 b ( e ) b(e) ,此時 b ( e ) f ( e ) c ( e ) b(e)\leq f(e)\leq c(e)

解決方案:令 f ( e ) = f ( e ) b ( e ) f'(e)=f(e)-b(e) ,此時就可以轉化爲只有最大流限制 0 f ( e ) c ( e ) b ( e ) 0\leq f'(e)\leq c(e)-b(e) 的情況,而此時頂點對應的總流入量和總流出量的關係變爲:流入的 f ( e ) + b ( e ) f'(e)+b(e) 等於流出的 f ( e ) + b ( e ) f'(e)+b(e)

此時可以看作是有一個最大流出量爲 b ( e ) b(e) 的源點和一個最大流入量爲 b ( e ) b(e) 的匯點與之相連。因此可以增加新的源點和匯點 S S T T ,對於每條邊 e = ( u , v ) e=(u,v) ,令新的容量 c ( e ) = c ( e ) b ( e ) c'(e)=c(e)-b(e) ,並從 S S v v 連一條容量爲 b ( e ) b(e) 的邊,從 u u T T 連一條容量爲 b ( e ) b(e) 的邊,並從 S S s s 連接一條容量爲無窮的邊,從 t t T T 連接一條容量爲無窮的邊,這樣就轉爲了沒有最小流量限制的情況。
在這裏插入圖片描述

圖發生部分變化的情況

在某些問題中,求完某個圖的最大流之後,需要對原圖中的一部分做一些變化,再對新圖求最大流。這種情況下,有時不需要重新計算最大流,而可以重複利用前一步的結果,高效地求出新的最大流。
在這裏插入圖片描述
在這裏插入圖片描述

容量爲負數的情況

雖然在網絡流問題中,通常不會有容量爲負數的邊。但是將問題轉化爲最小割時,有可能出現容量爲負數的邊。一般情況下,我們不能利用最大流算法來求解包含負容量邊的圖的最小割,也沒有已知的有效算法。但有些情況下,可以採取適當的變形而避免出現負容量邊。