/*
有源匯上下限最小流
(1)新增超級源點ss和超級匯點tt
(2)對於原有的邊(u,v,l(u,v),c(u,v))(l為流量下限,c為流量上限),新增邊(u,v,0,c-l);
(3)對於每個結點i,記w[i]=l(u,i)-l(i,v)=f(i,v)-f(u,i);出-入
若w[i]>0,新增邊(ss,i,w[i]),若w[i]<0,新增邊(i,tt,-w[i]);
(4)求解ss-tt的最大流,記為f1
(5)新增(t,s,inf),求ss-tt的最大流,記為f2
(6)如f1+f2==sum,則有最小流,則[t,s]的流量就是最小流,即edge[id^1].flow
*/#include #include#include using namespace std;
const int inf=0x3fff3ff;
const int maxn=1500;
struct edge
edge[maxn];
int head[maxn],cnt;
int pre[maxn];
int cur[maxn];
int gap[maxn];
int level[maxn];
int w[maxn];
int s,t,ss,tt,tot,sum;
inline void addedge(int u,int v,int flow)
void build_graph(int n,int m)
for(int i=1;i<=tot;i++)
if(w[i]>0)addedge(ss,i,w[i]);
else if(w[i]<0)addedge(i,tt,-w[i]),sum+=-w[i];
}int sap(int start,int end,int tot)//別打成s,t
ans+=inf;
inf=inf;
}break;
}} if(!flag)
level[u]=minn+1;
gap[minn+1]++;
if(u!=start)
u=pre[u];
} }return ans;
}int main()
return 0;
}
有源匯上下界最小流 模板
這只是 其中一種 做法 這只是其中一種做法 這只是其中一 種做法 我暫時還沒有理解,只是先放個模板而已 首 先還 是根據下 界來建圖 原圖源 點s,匯 點t 首先還是根據下界來建圖,原圖源點s,匯點t 首先還是根據 下界來建 圖,原圖 源點s,匯點t 然 後因 為流量守 恆,新建 超級源s 1和超級...
117 有源匯有上下界最小流
題目描述 n nn 個點,m mm 條邊,每條邊 e ee 有乙個流量下界 lower e text e lower e 和流量上界 upper e text e upper e 給定源點 s ss 與匯點 t tt,求源點到匯點的最小流。輸入格式 第一行兩個正整數 n nn m mm s ss t...
有源匯有上下界最大 最小流
建圖還是要想一想的.寫一下吧 首先根據有源匯可行流建圖,正向附加邊滿流證明有可行流 然後在這個殘量網路上刪掉 t,s,oo 這條邊,跑 s t 最大流就是最大流,t s 最大流就是最小流 include define int long long define ll long long define ...