有上下界網絡流問題

有上下界網絡流

有上下界的網絡流便是在普通的網絡流的基礎上,額外添加每條邊流量的限制。html

普通的網絡流能夠認爲是特殊狀況的上下界網絡流,即流量限制爲\(f_i\in [0,maxflow]\)網絡

而如今,咱們要求的每條邊的容量限制爲\(f_i\in [B_i,C_i]\)spa

這類問題咱們大體能夠分紅三類。htm

無源匯 上下界可行流

由於沒有源點和匯點,因此全部點都要知足流量平衡。blog

若是咱們可以不考慮下界的話,就直接能夠照搬最大流。get

由於下界是必定要流滿的,因此咱們先強制全部邊流滿下界,只考慮剩下的流量\(g_i\)ast

那麼,也就是對於每個點\(x\),都要知足流量平衡的方程:class

\[\sum B_{(x,v)}+\sum g_{(x,v)}=\sum B_{(u,x)}+\sum g_{(u,x)}\]基礎

若是可以知足這個方程的話,每條邊流量爲\(B_i+g_i\)便是一組可行流。di

考慮將流量分類,由於\(B\)是已知量,因此移項考慮左側\(B\)和右側\(g\)

假設左側\(M(x)=\sum B_{(u,x)}-\sum B_{(x,v)}\)

因此變成了須要知足\(M(x)=\sum g_{(x,v)}-\sum g_{(u,x)}\)

由於不知道誰大誰小,因此按照\(M\)大小進行分類討論

若是\(M(x)\ge 0\),那麼有\(\sum g_{out}=\sum g_{in}+M\)

也就是流出須要比流入的流量要多\(M\),可是須要知足流入等於流出。

因此創建一個超級源,連邊\((S,x)\),容量爲\(M\),來補足流入少的\(M\)

反之,若是\(M(x)\lt 0\)

也就是流入多於流出,那麼須要額外流出\(M\)

同理創建超級匯,連邊\((x,T)\),容量爲\(-M\),補足流出不足的\(M\)

如今已經能夠知足流量平衡了,在當前圖上跑最大流。

由於上面的全部\(M\)都是已知量,也就是若是可行流存在的話,

全部的流出源和流入匯的全部邊必須滿流,不然沒法補足上述流量下界要求的東西。

因此這裏就能夠解決無源匯可行流的問題。

有源匯 上下界可行流

依然是可行流問題,上面已經解決了無源匯的可行流問題,考慮可否將當前的有源匯轉化爲無源匯。

顯然有源匯的的可行流中,除了源匯以外的全部點都知足流量平衡。

而流出源的容量等於流入匯的流量,因此連邊匯到源,容量爲\(inf\),這樣全部點均可以知足流量平衡。

同時沒有了源匯,轉換爲了無源匯上下界可行流問題。

有源匯 上下界最大流

由可行流變爲了最大流問題。

首先明確一點,最大流必定是可行流,因此必定要先判斷是否存在可行流。

跑完可行流以後可能有一些邊還能夠接着流,既然已經存在可行流了。

刪除超級源超級匯,以及\(T->S\)的邊,再在殘餘網絡上解決最大流便可。

(超級源匯沒有必要刪去,由於不會答案產生影響)

那麼答案就是殘餘網絡上的最大流加上可行流。

注意一下可行流是什麼東西,是\(T->S\)這條邊流過的流量。

不要和超級源超級匯之間的流量搞混了。

我寫的板子

有源匯 上下界最小流

最小流問題,在沒有上下界限制的時候是沒有意義的。(由於你能夠全部邊都不動啊)

首先仍是判斷可行流是否存在。

和上面同樣刪除掉超級源匯以及\(T->S\)的邊,繼續在殘餘網絡上考慮。

其實只須要儘量退流就行了,也就是求\(T->S\)的最大流,而後用可行流-最大流便可。

我寫的板子

Last

這套理論從這裏學的,這個博主好強啊orzorz

相關文章
相關標籤/搜索