上下界网络流

dalao博客传送门:有上下界的网络流学习笔记by liu_runda

定义

好像没什么好定义的, 就是每条边的流量除了上界还有下界。

无源汇上下界可行流

ps:这个问题的算法是其他上下界网络流的基础,所以一定要完全背板理解。
无源汇上下界可行流指的是没有源汇的上下界网络流,也就是说只需要满足每个点流量守恒即可,所以一般求可行流。
由于一般的网络流只有上界,所以我们想到先让所有边的流量都等于下界,然后再加上一些附加流,使得所有边流量守恒(程序实现时不能够将流量设为下界,而是要将流量设为0,同时将容量设为上界-下界,使得流量只增不减)。
假设现在所有边的流量已经等于下界了。我们对于一个点 i ,记录 num[i] = i 点流入量- i 点流出量,那么如果:
1. num[i]=0 ,这说明 i 点是流量守恒的,不需要进行处理。
2. num[i]>0 ,这说明 i 点入>出,我们需要为这多余的流找个来源,于是连一条附加源 SS -> i 的容量为 num[i] 的边。
3. num[i]<0 ,这说明 i 点出>入,我们需要为这多余的流找个去处,于是连一条 i -> 附加汇 TT 的容量为 num[i] 的边。

我们会发现,如果存在一种可行流使得 SS -> TT 满流(即 SS 连出的所有边都满载,且由于 ni=1num[i]=0 ,所以等价于 TT 连入的所有边都满载),那么就说明原网络存在可行流。而如果有满载,显然应该是最大流。
这样的话,如果有解,原网络中每条边的流量是多少呢?其实就是下界+流量(附加流)。

有源汇上下界可行流

顾名思义就是在上个问题的基础上加了源 S 和汇 T 嘛……
其实想法非常简单,再连一条 T -> S 的容量为 的边,就变回无源汇上下界可行流了。
可行流的流量显然就是 T -> S 这条边的流量。

有源汇上下界最大流

我们先求出一个有源汇上下界可行流,但这个流并不一定是最大流,所以我们要想办法修正可行流,使得可行流变成最大流。
这并不困难:我们刷一下 S -> T 的最大流即可!为了保险,在此之前我们先把多余的边也就是与 SS , TT 相连的边以及 T -> S 的边“干掉”(程序实现时使其满载即可)。

有源汇上下界最小流

由于有了下界,于是冒出来了“最小流”,和最大流的想法一样,我们用可行流减少尽量多的流从而修正出最小流。
等等……好像没有这种操作,怎么办啊?其实我们发现这和求 S -> T 的最大流是个相反的过程:求 T -> S 的最大流!
这样就和有源汇上下界最大流一样了。

模板题

无源汇上下界可行流:ZOJ2314题解传送门
有源汇上下界最大流:ZOJ3229题解传送门
有源汇上下界最小流:BZOJ2502题解传送门

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

ZigZagK

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值