這只是
其中一種
做法
這只是其中一種做法
這只是其中一
種做法(我暫時還沒有理解,只是先放個模板而已)
首 先還
是根據下
界來建圖
,原圖源
點s,匯
點t
首先還是根據下界來建圖,原圖源點s,匯點t
首先還是根據
下界來建
圖,原圖
源點s,
匯點t
然 後因
為流量守
恆,新建
超級源s
1和超級
匯t1向
各個點連
邊然後因為流量守恆,新建超級源s1和超級匯t1向各個點連邊
然後因為流量
守恆,新
建超級源
s1和超
級匯t1
向各個點
連邊 跑一遍
s1到t
1的最大
流(也就
是可行流
)跑一遍s1到t1的最大流(也就是可行流)
跑一遍s1到
t1的最
大流(也
就是可行
流) 然後t
到s連一
條流量i
nf的邊
然後t到s連一條流量inf的邊
然後t到s連
一條流量
inf的
邊 再 跑一
遍s1到
t1的最
大流
再跑一遍s1到t1的最大流
再跑一遍s1
到t1的
最大流
此 時t
到s的那
條邊的反
向弧流量
就是最小
流此時t到s的那條邊的反向弧流量就是最小流
此時t到s的
那條邊的
反向弧流
量就是最
小流
#include using namespace std;
const int maxn=2e5+10;
const int inf=1e9;
int n,m,s,t;
struct edged[maxn]; int head[maxn],cnt=1;
void add(int u,int v,int flow),head[u]=cnt;
d[++cnt]=(edge),head[v]=cnt;
}int dis[maxn],in[maxn],up[maxn],down[maxn],g[maxn];
bool bfs(int s,int t)
} }return false;
}int dinic(int u,int t,int flow)
} return flow-res;
}int maxflow(int s,int t)
int vis[109][109],row[109],col[109];
int main()
int s=0,t=n+m+1;
int s1=t+1,t1=t+2;
for(int i=1;i<=n;i++)
//下界是row[i],上界是temp
add(s,i,temp-row[i]);
in[s]-=row[i],in[i]+=row[i];
} for(int i=1;i<=m;i++)
int sumn=0;
for(int i=0;i<=n+m+1;i++)
if( in[i]>0 ) add(s1,i,in[i] ),sumn+=in[i];
else add( i,t1,-in[i] );
int ans=maxflow(s1,t1);
add(t,s,inf);
int now=maxflow(s1,t1);
cout << d[cnt].flow;
}
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 ...
有源匯上下界網路流
loj116 給出乙個有源匯點的有向圖。每條邊有最大流量和最小流量。現在需要求出從源點到匯點的最大流可以是多少。上下界可行流 先回顧有源匯上下界可行流乾了些什麼。其實可行流就是找到了一種滿足流量下界的方案。在滿足了流量下界之後,可以發現還有一些殘餘的自由流量 可選可不選 於是我們在之前的殘餘網路上再...