• 上下界网络流


    •参考资料

    [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

     

  • 相关阅读:
    Spring_AOP动态代理详解(转)
    Java中spring读取配置文件的几种方法
    SpringMVC工作原理2(代码详解)
    SpringMVC工作原理1(基础机制)
    Web服务器和应用服务器简介
    WEB服务器与应用服务器解疑
    WebService基本概念及原理
    HTTP协议
    TCP、UDP协议间的区别(转)
    HTTP、TCP、UDP以及SOCKET之间的区别/联系
  • 原文地址:https://www.cnblogs.com/MMMinoz/p/11712383.html
Copyright © 2020-2023  润新知