sgu176 有源匯上下界最小流

2022-03-15 23:36:53 字數 1599 閱讀 7837

題意:有一堆點和邊,1起點,n終點,某些邊有可能必須滿流,要求滿足條件的最小流

解法:按原圖建邊,滿流的即上下界都是容量,但是這樣按有源匯上下界可行流求出來的可能不是最小流,那麼我們需要開始建邊的時候不要建從t到s的邊,先跑一邊從ss到tt的最大流,然後把該邊加上再跑一次從ss到tt的最大流,那麼從t到s的反向邊流過的流量就是原圖的最小流,為什麼是這樣呢,這是因為當我們第一遍跑最大流的時候,此時沒有t到s的這條邊,那麼圖中的流量會盡量按其他的邊流,當我們第二次跑最大流的時候,流出來的都是第一次中已經無法流到終點的流量,此時再跑最大流時我們就儘量減少了t到s這條邊上的流量,實際上可以看成延遲t到s的增流

#include#define fi first

#define se second

#define mp make_pair

#define pb push_back

#define pii pair#define c 0.5772156649

#define pi acos(-1.0)

#define ll long long

#define mod 1000000007

#define ls l,m,rt<<1

#define rs m+1,r,rt<<1|1

using

namespace

std;

const

double g=10.0,eps=1e-12

;const

int n=100+10,maxn=10000+10,inf=0x3f3f3f3f

;struct

edgee[maxn

<<2

];int

cnt,head[n];

intdis[n];

intin[n],out

[n];

void add(int u,int v,int c,int

low)

bool bfs(int s,int

t) }

}return0;

}int dfs(int x,int mx,int

t) }

if(!flow)dis[x]=-2

;

return

flow;

}int maxflow(int s,int

t)

return

ans;

}void

init()

intmain()

int ss=n+1,tt=n+2

;

int sum=0

;

for(int i=1;i<=n;i++)

int flow=maxflow(ss,tt);

add(t,s,inf,0);

flow+=maxflow(ss,tt);

if(sum!=flow)cout<

impossible

"<

else

}return0;

}/********************

*******************

*/

view code

sgu 176 上下界網路流最小可行流帶輸出方案

演算法步驟 1.先將原影象最大可行流那樣變換,唯一不同的是不加dst src那條邊來將它變成無源無匯的網路流圖.直接跑一邊超級源到超級匯的最大流.2.加上剛才沒有加上的那條邊p 3.再跑一遍超級源匯之間的最大流,p的流量就是我們要求的最小可行流流量 等於其反向邊的 容量 收穫 1.最大可行流和最小可...

有源匯上下界最小流 模板

這只是 其中一種 做法 這只是其中一種做法 這只是其中一 種做法 我暫時還沒有理解,只是先放個模板而已 首 先還 是根據下 界來建圖 原圖源 點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...