有上下界的網絡流便是在普通的網絡流的基礎上,額外添加每條邊流量的限制。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\)的最大流,而後用可行流-最大流便可。
這套理論從這裏學的,這個博主好強啊orzorz