浅谈上下界网络流

背景

最近一直在做这类题目……
感觉题目变化还是挺多的
就在这里总结一下好了……

首先Orz Lynstery
本文参考博客:有上下界的网络流学习笔记——by liu_runda

正文

上下界网络流,显然就是对每条边有上下界流量限制的网络流问题
众人:这不废话嘛
对于上下界网络流问题,最重要的思想是“转化”
因为学习后你会发现:处理每一种情形都是要由前一种更为简单的情形转化过来,然后用同样的方法处理
所以一道题目可能会转化很多次,才能下手


上下界网络流一般可分为以下几种:

无源汇上下界可行流

RT,只要找到一个可行解即可
这种模型最大的特点是无源无汇、无始无终,不断循环的一个过程
此时笔者不禁想到了这幅名画:
这里写图片描述

好了扯远了,我们来考虑一下如何处理该问题:

首先,因为我们所有边的流量不得小于其下界,我们将所有边的流量都设为其下界
然后构建另一套图,即原图的残量网络
因为已经减去当前流量(下界),所以新图就转化成了普通网络流,非常方便

可是,仅仅这样的话很可能不是一个可行解
因为这个流不满足流量守恒
即:一个点进入的流量与出来的流量不等

此时我们需要构建虚拟源点SS,虚拟汇点TT
若i点原来 入>出,则SS向i连一条容量为其差值的边
若i点原来 出>入,则i向TT连一条容量为其差值的边
因为一条边最终流量等于 下界+新图对应流量,原来流量不平衡的点需要用虚拟源汇来补偿流量

因为当且仅当SS的所有连边都满流时有解
所以刷SS到TT的最大流即可
前面提过,一条边最终流量等于 下界+新图对应流量,根据这个可以求一些题目的答案

有源汇上下界可行流

(给定源汇是S和T,虚拟源汇是SS和TT,不要混淆起来!)
考虑连一条T到S的无限制的边
那么有源汇就转化成了无源汇

值得一提的是,如果想要知道可行流的流量,可以直接看T到S那条新加边的流量(根据流量守恒)

有源汇上下界最大流

先刷出一个可行流
如果有解,那么SS的所有边都满流了,也就完成了它的使命
接下来只需要刷S到T的最大流即可
(接下来S到T不管怎么变,都影响不了SS的出边,所以一直是满足流量守恒的)
(而且这是残量网络,不用考虑会突破下界)
不过我个人还是习惯把SS,TT的所有边以及T到S的那条边删去,这样感觉清爽一点

答案是可行流流量+S到T最大流流量

有源汇上下界最小流

还是要先刷出可行流
和最大流一样的道理,此时需要把S到T的流量尽量减小
可是……可是好像没有这种操作啊(脸红
考虑反向弧的本质:反向弧增加意味着正向弧减少
所以刷T到S的最大流

答案是可行流流量-T到S最大流流量

例题

这几天A的题目……
BZOJ2406
BZOJ2502
ZOJ2314