有上下界網絡流問題


有上下界網絡流

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

普通的網絡流可以認為是特殊情況的上下界網絡流,即流量限制為\(f_i\in [0,maxflow]\)

而現在,我們要求的每條邊的容量限制為\(f_i\in [B_i,C_i]\)

這類問題我們大致可以分成三類。

無源匯 上下界可行流

因為沒有源點和匯點,所以所有點都要滿足流量平衡。

如果我們能夠不考慮下界的話,就直接可以照搬最大流。

因為下界是一定要流滿的,所以我們先強制所有邊流滿下界,只考慮剩下的流量\(g_i\)

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

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

如果能夠滿足這個方程的話,每條邊流量為\(B_i+g_i\)即是一組可行流。

考慮將流量分類,因為\(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


免責聲明!

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



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