有源汇有上下界最小流详解(loj117)

例题链接
首先还是得吐槽一下题意。
题意是这样的:
求出一个流使得源点的总流出量等于汇点的总流入量,其他的点满足流量守恒,而且每条边的流量满足上界和下界限制。在这些前提下要求总流量最小。

解法:
没学过无源汇有上下界可行流的还是先学学吧

好像是有两种做法的。
做法1:
首先先求出可行流,按照上一篇博客的做法即可。
上一篇博客
很明显现在已经满足下界了,那么我们只需在残量网络上求出最小流即可。
此时需要理解反向边。
反向边的流量增加等价于正向边的的流量减少。
那么t到s的流就相当于s到t减少的流。
那么求出t到s的最大流就相当于s到t减少最多的流,那么剩下的就是最小流。
所以最后的答案就是可行流大小-t到s的最大流

然而我并没有用第一种做法(以后可能会补代码吧)

做法2:(其实我觉得做法1更容易理解)
建立超级源和超级汇之后呢。
先跑一次最大流。
然后t到s连一条无穷大的边。
再跑一次最大流。
最后的答案就是无穷大的边流过的流量。
有点难理解。
首先因为整个图满足流量平衡。
所以说t点流入的流量等于流出的流量。
那么他流出的流量只有那一条无穷大的边而已。
所以说最小流就是求那条边(无穷边)流过的流量尽量小而已。

所以说第一次流最大流的时候已经满足下界。那么满足下界能流的边已经流满。
所以残量网络剩下的最大流就会尽可能的小了。

大概就是这样吧。
代码实现:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值