有源汇有上下界最大流【模板】loj116
发布日期:2021-06-30 10:20:44 浏览次数:3 分类:技术文章

本文共 2147 字,大约阅读时间需要 7 分钟。

和 无 源 汇 相 比 就 是 多 了 源 点 s 和 汇 点 t 和无源汇相比就是多了源点s和汇点t st

s 和 t 点 不 满 足 流 入 = 流 出 , 那 我 们 就 变 化 一 下 s和t点不满足流入=流出,那我们就变化一下 st=,

t 到 s 连 一 条 流 量 i n f 的 边 , 这 样 构 成 循 环 流 , s 和 t 也 满 足 流 量 守 恒 t到s连一条流量inf的边,这样构成循环流,s和t也满足流量守恒 tsinf,,st

接 下 来 就 和 无 源 汇 可 行 流 一 样 了 , 可 行 流 就 是 t 到 s 的 流 量 ( s − t 的 反 向 弧 嘛 ) 接下来就和无源汇可行流一样了,可行流就是t到s的流量(s-t的反向弧嘛) ,ts(st)

但是这是可行流,怎么求s到t的最大流?

很 简 单 , 直 接 从 s 到 t 跑 最 大 流 即 可 很简单,直接从s到t跑最大流即可 ,st

因 为 此 时 s − > t 直 接 连 接 , 有 可 行 流 f 1 因为此时s->t直接连接,有可行流f1 s>t,f1

除 此 之 外 , 剩 下 的 流 量 可 以 随 便 跑 ( 已 经 满 足 流 量 守 恒 ) 除此之外,剩下的流量可以随便跑(已经满足流量守恒) ,便()

#include 
using namespace std;const int maxn=2e5+10;const int inf=1e9;struct edge{ int to,nxt,flow;}d[maxn]; int head[maxn],cnt=1;void add(int u,int v,int flow){ d[++cnt]=(edge){v,head[u],flow},head[u]=cnt; d[++cnt]=(edge){u,head[v],0},head[v]=cnt;}int n,m,s,t;int in[maxn],dis[maxn],up[maxn],down[maxn];bool bfs(){ memset(dis,0,sizeof(dis)); dis[s]=1; queue
q; q.push( s ); while( !q.empty() ) { int u=q.front(); q.pop(); for(int i=head[u];i;i=d[i].nxt ) { int v=d[i].to; if( dis[v]==0&&d[i].flow ) { dis[v]=dis[u]+1; if( v==t ) return true; q.push( v ); } } } return false;}int dinic(int u,int flow){ if( u==t ) return flow; int res=flow; for(int i=head[u];i&&res;i=d[i].nxt ) { int v=d[i].to; if( dis[v]==dis[u]+1&&d[i].flow ) { int temp=dinic(v,min(d[i].flow,res) ); if( temp==0 ) dis[v]=0; d[i].flow-=temp,d[i^1].flow+=temp; res-=temp; } } return flow-res;}int main(){ int S,T; cin >> n >> m >> S >> T; for(int i=1;i<=m;i++) { int l,r; cin >> l >> r >> down[i] >> up[i]; add(l,r,up[i]-down[i] ); in[l]-=down[i],in[r]+=down[i]; //这条边有down[i]的流量,所以前面l需要down[i]流入,r需要流出down[i] } add(T,S,inf); s=0,t=n+1; int ans=0,sumn=0; for(int i=1;i<=n;i++) if( in[i]<0 ) add(i,t,-in[i] );//流入太多,给汇点 else add(s,i,in[i] ),sumn+=in[i];//流出太多,源点补充 while( bfs() ) ans+=dinic(s,inf); if( ans!=sumn ) puts("please go home to sleep"); else { s=S,t=T; ans=0; while( bfs() ) ans+=dinic(s,inf); cout << ans; }}

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/108238955 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【模板】有源汇上下界最大流
下一篇:无源汇有上下界可行流[loj模板]

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月28日 12时47分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章