上下界网络流

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题解传送门

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值