网络流衍生物——有上下界网络流の板子

处理流量下界的第一步

如果网络流问题中加入了流量下界,我们该怎么做呢?
抓瞎
像Dinic啊ISAP之类的网络流板子好像都只能无脑乱流没法处理流量下界的问题
说不定以后发明一种能处理流量下界的网络流算法?
但是现在只能在建图上下手了。。

对于一个有上下界的网络流图,记 (u,v) 这条边的下界为 L(u,v) ,上界为 R(u,v) 。那么对于一条边来说,流过它的流量可以分为两部分。一部分是必须满足的下界 L(u,v) ,另一部分是可以自由增多或者减少的 R(u,v)L(u,v) ,把这一部分流量记作 F(u,v)
显然目前的网络流算法只能处理 F(u,v) 的这一部分。那么我们要做的第一步就是把原图中的边的流量设置为 F(u,v) ,并且取消它的下界限制。
如果我们把此时 (u,v) 这条边实际上流过的流量记作 T(u,v) ,那么看起来 T(u,v)+L(u,v) 就是一种可行的流量方案?
似乎没有这么简单,因为凭空消失的流量下界不可能就这么罢休了。
接下来再如何处理,就要视具体问题而定了。

有上下界的网络流基本上有四种类型:无源汇可行流,有源汇可行流,有源汇最大最小流和有上下界的费用流。

无源汇可行流

所谓无源汇可行流问题,就是题目给你的这个图就是一个封闭的网络,每条边有上下界,问这个图能否在满足每条边上下界和流量平衡的条件下使流量循环流通。这个问题虽然非常局限,但它是上下界网络流问题中最基本的问题,其它问题的建图都是以它为基础的。

刚才我们把所有边的流量都替换成了 R(u,v)L(u,v)=F(u,v) 并取消了它的下界限制。仅仅这样做到底为什么不对呢?
网络流图要满足的一个重要条件就是流量守恒,就是对于除了源点和汇点以外的其它中间节点,它接收多少流量就要流出多少流量。但是我们强行去掉流量下界然后把 T(u,v)+L(u,v) 作为这条边的可行流量,相当于每条边凭空多出了 L(u,v) 这么多的流量,那么流量守恒条件就不一定满足了。比如下面这个图:
这里写图片描述
右图是左图经过处理以后的图。显然右图上的可行流量是1。但是当把流量下界加进去以后可以发现最上面那个节点流进了2个单位流量,但是流出了3个单位流量。

对于一条 uv 的边,如果把这条边的流量替换为 F(u,v) ,那么就少给了 v L(u,v)的流量,多给了 u L(u,v)的流量。记一个点 u 的“缺失流量”D(u)=L(xu)L(uy),这些流量我们必须想办法补上,才能保证加入流量下界以后仍然流量守恒。

那么就到了源点和汇点出现的时候了!源点作为唯一一个可以无限流出流量的点,汇点作为唯一一个可以任意流入流量的点,它们恰好可以为缺失流量的点补充流量,为冗余流量的点导出流量。
对于所有的点计算出它的 D(u) 以后,如果它的 D(u)>0 ,说明它是一个缺失流量的点,需要从源点 S 向它连边,流量为D(u);如果它的 D(u)<0 ,说明它是一个有多余流量的点,需要从它连到汇点 T ,流量为D(u)
那么上面那个图经过上述改造以后就变成了这样:
这里写图片描述
可以发现新增的源汇是为了补足丢失的下界,那么如果新增的边能够全部满流说明下界的限制是可以满足的,即存在可行流。此时将流过每条边的流量 T(u,v) 加上 L(u,v) 就得到了这条边可行的实际流量。

例题:POJ2314 Reactor Cooling

这题就是板子题。。作为练手的第一道题还是很不错的。

有源汇可行流

那么如果按照题目建的图本来就存在一对源汇,再按照上面的方法添加附加源汇岂不就成了有两对源汇的网络流图?
那么我们要做的就是把原图的源汇强行去掉,变成一个无源汇的网络流图以后再添上我们自己的源点汇点。
设原图的源汇为SS和TT,我们从TT到SS连一条下界为0,上界为inf的边。这样的话从SS流出的流量最终还会回到SS,并且想流多少流多少,这样就和上面提到的循环流通是一样的了。
然后我们求出包括SS和TT在内的每个点的 D(u) ,添加附加源汇S和T建图就可以了。
同样,如果新图满流说明存在可行流。这个时候从TT到SS的那条边流过的流量就是可行流的大小。

例题:POJ2396 Budget

板子题+1

例题:BZOJ2406 矩阵

难点在于把这个题转化为网络流模型,然后用可行流来判定。

有源汇最大最小流

在给定源汇的情况下要求最大最小流也是常见的题型之一。
仍然考虑添加附加源汇以后的这个网络流图,如果从附加源汇S和T连出的那些边都能满流,说明至少下界的限制已经能够满足了,但此时流出的流量不一定是最大,也不一定是最小。
也就是说,当前这部分流量有可能还能退回去一些,也有可能还能再流出去一些,都是能满足下界限制的可行解。

同样设原图的源汇为SS和TT,那么,对于最大流,我们就考虑在可行流的基础上让它再从SS尽量往TT多流一些。
方法就是跑出可行流之后,把TT到SS的那条边拆掉,然后从SS到TT在残余网络上再跑一遍最大流。设此时跑出的最大流为 F2 ,TT到SS那条边记录的可行流为 F1 ,那么 F1+F2 就是这个有上下界网络流图能够承载的最大流。

最小流的做法是类似的,我们希望让它在可行流的基础上把流量尽量多地退回SS,同样拆掉TT连到SS的那条边并且记录可行流 F1 ,然后从TT到SS跑最大流。设跑出的最大流为 F2 ,那么 F2 就是这个图能够退给SS的最大流量, F1F2 就是原图的最小流。

例题:POJ3801 Crazy Circuits

最小流板子题+1

例题:BZOJ2502 清理雪道

最小流板子题+2

例题:BZOJ3698 XWW的难题

可以转化为有上下界的最大流

有上下界的费用流

费用流也可以加入上下界?
只需要按照上面的规则建图,原图中的边保留费用,新增的什么TT到SS的边啦,还有补流的那些边费用都设置成0。因为流出来的实际流量要加上原来的下界,那么费用也把下界的那一部分算进去就可以了。
也就是说,实际费用=新图中跑出来的费用+所有边的下界*费用之和。

但是有上下界的费用流和普通费用流有一个很大的区别!
普通的费用流是保证流量最大的前提下求出的最小或最大费用
而有上下界的费用流是满足流量限制的前提下求出的最小或最大可行费用
因为跑的时候本来跑的就是可行流嘛。
这个特性是非常值得利用的,因为有时候普通费用流非得要保证流量最大其实挺烦人的

例题:BZOJ2055 80人环游世界

板子题+1

BZOJ4108 Catering

这个题就利用了有上下界费用流的特性

BZOJ3876 支线剧情

仍然是不保证流量最大的特性使这个题用上下界费用流做变得非常简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值