考慮有源匯上下界可行流:由匯向源連inf邊,那麼變成無源匯圖,按上題做法跑出可行流。此時該inf邊的流量即為原圖中該可行流的流量。因為可以假裝把加上去的那些邊的流量放回原圖。
此時再從原來的源向原來的匯跑最大流。超源超匯相關的邊已經流滿不會再退流,則下界可以滿足,並且在此基礎上增廣是可以保證原圖的流量平衡的。求出的最大流即為原圖最大流。因為顯然原圖最大流=可行流流量+原圖新增流量,而可行流流量等於匯到源流量,這部分在跑最大流的時候被退流並計入答案。
#include#include#include
#include
#include
#include
using
namespace
std;
intread()
while (c>='
0'&&c<='
9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}#define n 210
#define m 50000
#define s 0
#define t 201
#define inf 1000000000
int n,m,w,v,t=-1,p[n],degree[n],l[m],tot=0
;int cur[n],d[n],q[n],ans=0
;struct dataedge[m];
void addedge(int x,int y,int
z)bool bfs(int s,int
t) }
while (headreturn ~d[t];
}int work(int k,int f,int
t)
if (used==0) d[k]=-1
;
return
used;
}void dinic(int s,intt)}
intmain()
for (int i=1;i<=n;i++)
if (degree[i]>0) addedge(s,i,degree[i]),tot+=degree[i];
else
if (degree[i]<0) addedge(i,t,-degree[i]);
addedge(v,w,inf);
dinic(s,t);
if (ans"
please go home to sleep";
else ans=0,dinic(w,v),cout
}
LOJ 116 有源匯上下界最大流
有源匯上下界最大流 模板題。具體講解見 sap演算法或dinic演算法跑出來的是殘量網路上,還能增加多少流量!s t 的最大流解法 建立附加源匯ss,tt。建法詳見上面的博文 並建邊t s,容量為正無窮。跑一遍ss tt最大流,若等於附加出邊容量和,即滿足下界滿流,則繼續求最大流,否則此題無解 無最...
有源匯有上下界最大流詳解(loj116)
例題鏈結 首先吐槽一下放題人 我不知道是不是我理解錯了什麼。題目描述裡就乙個上下界然後就說要求最大流。直接建上界然後跑最大流不就完了麼?實際上原題是這樣的 求出乙個流使得源點的總流出量等於匯點的總流入量,其他的點滿足流量守恆,而且每條邊的流量滿足上界和下界限制。在這些前提下要求總流量最大。沒學過無源...
Loj 116 模板 有源匯有上下界最大流
n nn個點m mm條邊的一張圖,每條邊有流量上下限制,求源點到匯點的最大流。先別急著求上面那個,考慮一下怎麼求無源點匯點的上下界可行流。可以考慮先把下限流滿,這樣就會出現有的點流量不均衡的問題,考慮每個點除了下限以外還有附加流量,這些附加流量會最多佔能每條邊r l r lr l這麼多的流量,可以先...