有上下界網絡流
有上下界的網絡流即是在普通的網絡流的基礎上,額外添加每條邊流量的限制。
普通的網絡流可以認為是特殊情況的上下界網絡流,即流量限制為\(f_i\in [0,maxflow]\)
而現在,我們要求的每條邊的容量限制為\(f_i\in [B_i,C_i]\)
這類問題我們大致可以分成三類。
無源匯 上下界可行流
因為沒有源點和匯點,所以所有點都要滿足流量平衡。
如果我們能夠不考慮下界的話,就直接可以照搬最大流。
因為下界是一定要流滿的,所以我們先強制所有邊流滿下界,只考慮剩下的流量\(g_i\)。
那么,也就是對於每一個點\(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