上下界网络流

•参考资料

[1]:上下界网络流学习笔记

[2]:上下界网络流问题

[3]:上下界网络流

•无源汇的上下界网络流

•模型:

一个网络,求出一个流,使得每条边的流量$x_{i} \in [L_{i},R_{i}]$ ,每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终)

•构图:

重在处理下界的限制。

对于一条边 $u->v$,下界为$l$,上界为$r$。我们可以将这条边变为上界为$r-l$,下界为$0$。

相当于在可行流的基础上每条边的流量都减小了$l$。但是这样做了之后,流量却不守恒了。

流入$v$的流量少了$l$,流出$u$的流量也少了$l$。

所以要增加一个叫附加流的东西,使得这个附加流和我们的初始流合并之后满足流量守恒

即:

如果某个点在所有边流量等于下界的初始流中满足流量守恒,那么这个点在附加流中也满足流量守恒,

如果某个点在初始流中的流入量比流出量多$x$,那么这个点在附加流中的流出量比流入量多$x$.

如果某个点在初始流中的流入量比流出量少$x$,那么这个点在附加流中的流出量比流入量少$x$.

$x的值$可以枚举x的所有连边求出。比较方便的写法是开一个数组$du[]$,在输入边的时候,对于出点$u$,$du[u]-=l$,对于入点$v$,$du[v]+=l$

$du[i]$表示i在初始流中的流入量-流出量的值,那么$du[i]$的正负表示流入量和流出量的大小关系

建立一个超级源点$S$和超级汇点$T$,然后枚举所有的点$i$,

如果$du[i]<0$,则加$(i,T,-du[i])$,如果$du[i]>=0$,则加$(S,i,du[i])$

然后跑最大流,如果满流(也就是跑完最大流后所有正向边都为0)是可行的,否则不可行

最后,每条边在可行流中的流量=容量下界+附加流中它的流量(即跑完dinic之后所加反向边的权值).

•例题

【题目】

Zoj 2314 Reactor Cooling

给$n$个点及$m$根管子,每根管子连接两个点可单向运输液体,每时每刻每根管子流进来的物质要等于流出去的物质,$m$条管子组成一个循环体,里面流躺物质。

并且满足每根管子一定的流量限制,范围为$[L_{i},R_{i}]$.即要满足每时刻流进来的不能超过$Ri$,同时最小不能低于$L_{i}$。问是否可行,可行则输出一组可行解。

【思路】

在输入边的时候,对于出点$u$,$du[u]-=l$,对于入点$v$,$du[v]+=l$

建立一个超级源点$S$和超级汇点$T$,然后枚举所有的点$i$,

如果$du[i]<0$,则加$(i,T,-du[i])$,如果$du[i]>=0$,则加$(S,i,du[i])$

然后跑最大流,如果满流(也就是跑完最大流后所有正向边都为0)是可行的,否则不可行

最后,每条边在可行流中的流量=容量下界+附加流中它的流量(即跑完dinic之后所加反向边的权值).

【代码】

Zoj 2314 Reactor Cooling

•有源汇的上下界最大流

•模型:

现在的网络有一个源点ss和汇点tt,求出一个流使得源点的总流出量等于汇点的总流入量,其他的点满足流量守恒,而且每条边的流量满足上界和下界限制.在这些前提下要求总流量最大.

•构图:

由于源点和汇点的存在使整个网络不满足流量守恒了,那是否可以对源点和汇点操作一下,再变回流量守恒?

可以的!连一条汇点tt到源点ss的边,这条边的流量为INF。由于源点的总流出量等于汇点的总流入量,所以整个网络又循环起来了。

也就可以转化成无源汇的上下界网络流了。于是套用无源汇的上下界网络流,建立超级源点$s$,超级汇点$t$,也就可以得到有源汇的上下界的可行流了。

但此时只是可行却不一定是最大的,那如何去求最大呢?

删去超级源点$s$和超级汇点$t$,在残留网络上跑最大流!(令$s=ss,t=tt$删去超级源点超级汇点,用在ss-tt上跑最大流)

因为第一次最大流只是求得所有满足下界的流量,而残留网络$(ss,tt)$路上还有许多自由流(没有和超级源点和超级汇点连接的边)没有流满,

所以最终得到的最大流=第一次流满下界的流+第二次能流通的自由流。

•例题

【题目】

Zoj 3229 Shoot the Bullet

一个人给$m$个人拍照,计划拍照$n$天,第$i$天给$C_{i}$个人拍照,每天拍照数不能超过$D_{i}$张,而且给每个人i拍照有数量限制$[L_{i},R_{i}]$,

对于每个人$j$,$n$天的拍照总和不能少于$G_{j}$,如果有解求最多能拍多少张照,并求每天给对应的人拍多少张照;没有可能输出-1。

【思路】

设一个源点$s$,$s$到第$i$天连一条上界为$D_{i}$下界为$0$的边,

每个人$j$到汇点连一条下界为$G_{j}$上界为无穷的边,

对于每一天,当天到第$i$个人连一条$[L_{i},R_{i}]$的边。

汇点$t$向源点$s$连一条INF的边,使得网络循环起来

设一个超级源点$ss$和超级汇点$tt$,然后枚举所有的点,

如果$du[i]<0$,则加$(i,tt,-du[i])$,如果$du[i]>=0$,则加$(ss,i,du[i])$

然后跑最大流,如果满流(也就是跑完最大流后所有正向边都为0)是可行的,否则不可行

再删去超级源点和超级汇点,跑最大流

最终得到的最大流=第一次流满下界的流+第二次能流通的自由流。

注意此题要按所给顺序输出

【代码】

Zoj 3229 Shoot the Bullet

•有源汇的上下界最小流

•模型:

现在的网络有一个源点s和汇点t,求出一个流使得源点的总流出量等于汇点的总流入量,其他的点满足流量守恒,而且每条边的流量满足上界和下界限制.在这些前提下要求总流量最小.

•构图:

依然是先跑出一个有源汇可行流.这时候的流也不一定是最小的.

假如我们能在残量网络上找到一条s-t的路径使得去掉这条路径上的流量之后仍然满足流量下限,我们就可以得到一个更小的流.

 

 如图转化成有源汇可行流得到的下界流(也就是最小流)是200 $(S$->$1$->$3$->$2$->$T$->$S)$

但是此图的实际最小流是100,问题出在原图中存在环(循环流),而我们没有利用,导致流增大了。

解决方法:先不增加 $t$->$s$ 容量为无穷的边,进行一次最大流,

如果还没有满流,则加一条 $t$->$s$ 容量为无穷的边,再进行一次最大流,

当且仅当所有附加弧满载时,有可行解,解为e[(t->s)^1].w(即t到s的后悔边权值)。

•理解:

有源汇的最小流与最大流的构图区别就在于:

最小流:先建立超级源汇跑一遍无源汇上下界最大流,然后增加 $t$->$s$ 容量为无穷的边跑最大流

最大流:增加 $t$->$s$ 容量为无穷的边并取超级源点超级汇点跑最大流,删去超级源点超级汇点跑最大流

•例题

【题目】

Sug 176 Flow construction

有一个加工生产的机器,起点为$1$终点为$n$,中间生产环节有货物加工数量限制,输出$u\ v\ z\ c$,描述一个加工环节,当$c$等于$1$时表示这个加工的环节必须对纽带上的货物全部加工(即上下界都为z),$c$等于$0$表示加工上界为$z$,下界为$0$,起点最少需要投放多少货物才能传送带正常工作。

【思路】

先建立超级源汇跑一遍无源汇上下界最大流,然后增加 $t$->$s$ 容量为无穷的边跑最大流

【代码】

Sug 176 Flow construction

 

posted @ 2019-10-21 11:23  MMMinoz  阅读(220)  评论(0编辑  收藏  举报