带上下界流量限制的网络流学习笔记

有上下界流量限制的网络流

本文主要写网络流中一些边容量有上下界限制的模型,主要是用于个人复习使用

0.一些定义

首先定义一个网络是一张加权有向图,定义这个图为\(G(V,E,C)\),其中\(V\)为图中的顶点,\(E\)为图中的边,\(C\)为边的容量上界,基础的网络流就是解决对于这种网络的一类问题
我们可以引入两个点:源点\(S\)和汇点\(T\)
定义\(f(u,v)\)为点\(u\)向点\(v\)的流量
定义对于\(G(V,E,C)\)的一个可行流满足网络中每个顶点\(v\in V\)(除了\(S,T\))满足\(\sum_{u\in V}f(u,v)=\sum_{u\in V}f(v,u)\),且对于每一条边\(e\in E\),满足\(f(u,v)\le C(u,v)\)
在所有的可行流中使得从源点流出的流量最大的流被称为该网络的最大流

现在如果给网络中的每一条边再增加一个流量的下界限制,即原网络变成\(G(V,E,B,C)\),其中\(V,E,C\)的定义不变,\(B\)为边的容量下界,对于网络中的一个可行流,对于每一个顶点\(v\in V\)需要满足\(\sum_{u\in V}f(u,v)=\sum_{u\in V}f(v,u)\),同时对于所有边\(e\in E\),满足\(B(u,v)\le f(u,v)\le C(u,v)\)
接下来我们着手于如何解决在有上下界流量限制的网络流的问题

1.无源汇上下界可行流(循环流)

最开始我们需要解决无源汇上下界可行流,这是解决之后的问题的基础
定义无源汇上下界可行流为:
在一个有上下界流量限制的网络\(G(V,E,B,C)\)中的一个流,对于所有的点\(v\in V\)满足:\(\sum_{u\in V}f(u,v)=\sum_{u\in V}f(v,u)\)且对于所有边\(e\in E\)满足\(B(u,v)\le f(u.v)\le C(u,v)\)

首先为了满足所有边下界的条件,我们先给每一条边流入下界的流量\(B(u,v)\),现在形成了一个流,但不一定满足关于点的条件\(\sum_{u\in V}f(u,v)=\sum_{u\in V}f(v,u)\)的条件,但一定满足关于边的条件\(B(u,v)\le f(u,v)\le C(u,v)\)
对于一些不满足条件的点,存在两种情况:

  1. \(\sum_{u\in V}f(u,v) > \sum_{u\in V}f(v,u)\)
  2. \(\sum_{u\in V}f(u,v) < \sum_{u\in V}f(v,u)\)

第一种情况其实就是流入该点的流量大于流出该点的流量
第二种情况其实就是流入该点的流量小于流出该点的流量
为了使得这个网络满足流量守恒的条件,我们引入一个附加流,满足附加流和原网络中的流合并之后可以形成一个可行流
如何构造这样的一个附加流呢
(为了简化我们定义\(in_v = \sum_{u\in V}f(u,v)\)\(out_v=\sum_{u\in V}f(v,u)\)
那就要使得原网络中不满足流量守恒的点在合并附加流之后满足流量守恒,即\(in_v=out_v\)
定义附加流网络为\(G'(V,E',C')\),对于每个点:

  • 如果在原网络中\(in_v>out_v\)(流入大于流出),令\(in_v-out_v=delta_v\),那么为了加入附加流之后满足流量守恒,那么在附加流中必然满足\(in'_v-out'_v=-delta_v\Rightarrow out'_v-in'_v=delta_v\),即流出大于流入,为了使得附加流满足这个条件,我们可以在附加流网络中增设一个附加源点\(SS\),从\(SS\)\(v\)连边,流量为\(delta_v\)

  • 如果在原网络中\(in_v<out_v\)(流入小于流出),令\(out_v-in_v=delta_v\),那么为了加入附加流之后满足流量守恒,那么在附加流中必然满足\(out'_v-in'_v=-delta_v\Rightarrow in'_v-out'_v=delta_v\),即流入大于流出,为了使得附加流满足这个条件,我们可以在附加流网络中增设一个附加汇点\(TT\),从\(v\)\(TT\)连边,流量为\(delta_v\)

  • 如果在原网络中\(in_v=out_v\),(流入等于流出),那么点\(v\)满足流量守恒条件,所以不需要再和附加源或附加汇连边了

然后我们在附加流网络中的新的边集\(E'\),没有了下界,只有上界,且上界\(C'(u,v)=C(u,v)-B(u,v)\)

接下来我们求原网络中的一个可行流,就可以转化为在附加流中求一个最大流
如果原网络中存在一个可行流,那么附加网络中的最大流一定要满足\(flow = \sum_{v\in V}C'(SS,v)\)或者\(flow=\sum_{v\in V}C'(v,TT)\)也即这些连着附加源和附加汇的边必须满流
如果不满流说明原网络中不存在可行流
否则存在可行流,且边\(e\in E\)的流量可以设为\(f(u,v)=B(u,v)+f'(u,v)\)

Example:ZOJ 2314 Reactor Cooling🔗

2.有源汇上下界最小流

现在加入了源点和汇点,源点和汇点和其他点的差别在于:源点没有流入量,而汇点没有流出量,这样我们怎么找到这个网络的最小流呢
我们假设从源点到汇点的最小流为\(f_{min}\)
那么我们如果从\(T\)\(S\)连一条容量上界\(<f_{min}\)的边,现在如果要找一个循环流,在这种情况下图中必然不存在一个满足条件的可行流。证明:如果存在可行流,现在把\(S\)\(T\)的边删去,那么原图的最小流\(<f_{min}\),与条件矛盾
如果我们从从\(T\)\(S\)连一条容量上界\(\ge f_{min}\)的边,就必然存在一个可行流
显然我们可以有一个找出有源汇上下界最小流的方案,就是二分最小流\(f_{min}\),然后判断是否存在一个循环可行流即可
Example:BZOJ2502 清理雪道🔗

3.有源汇上下界最大流

和处理最小流方法相同,这时候二分的是最大流\(f_{max}\),同时从\(T\)\(S\)连的边的下界设为\(f_{max}\)

可以用另一种方法,首先\(T\)\(S\)建一条\([0,INF]\)的边,然后跑一次循环流,找出附加流(从源点为\(SS\),汇点为\(TT\)),判断是否有可行流,然后在第一次Dinic跑出了循环流的一个可行流之后,删去\(T\)\(S\)的连边,再跑一次从\(S\)\(T\)的最大流就是答案
Example:ZOJ3229 Shoot the Bullet🔗

posted @ 2020-05-18 14:46  _kiko  阅读(363)  评论(1编辑  收藏  举报