前言
鶸鶸cosi以前做上下界网络流的题只会打板,并没有了解到算法本质。好久没有打过板的cosi今天考试果然在一道上下界最大流上挂了TAT。于是决定好好学习一下上下界网络流,下面是一些粗浅的理解,没有附代码,相信大家在众多博客中都找得到~~(雾)~~。
上下界网络流主要强调对初始流和附加流的理解,所以第一个讲解无源汇上下界可行流的篇幅会相对长一些,而后面的应用都是基于此,只是多了一些灵活套路的运用。
说明
- 可行流:一个网络网络中,存在一条流,满足任意点的总流入量等于总流出量(即流量守恒)。
- 边的流量:网络流连边时连的反向边上的 f l o w flow flow值,即为该边流量。(考虑在流过这条边时,在正向边上减去了流量大小的值,而反向边上恰好加上了这个值)。
无源汇上下界可行流
给定条件:一个网络中无源汇点,且每条边的流量满足给定特定条件下的上下界限制。
求任意一个满足条件的可行流,给出可行流中每条边的流量大小。
现在只需求出任意满足以上条件的流,即为该网络的可行流。
首先要满足的条件就是每条边的流量达到下界,之后再考虑为了满足流量守恒而在不溢出上界的情况下增流的方案。
可以称原始的所有边恰好达到下界(若对某一边没有特定要求即为0)的不一定满足流量守恒的流称为初始流,为了满足流量守恒而进行的适当增广添入的流所先独立形成的一个流称为附加流。两者在同一个网络下合并起来即为所求可行流。
对于初始流,只需要根据给定条件强制加上即可,我们只需要考虑如何处理附加流。
很显然可以发现,因为初始流附加流合并后的网络流量守恒,所以初始流附加流对每一个点来说其实是互补的。若初始流上某一点流入量不等于流出量,便在附加流上弥补掉这个差。
定义网络上一点 i i i的“差”为 a i a_i ai,满足 a i = i n i − o u t i a_i=in_i-out_i ai=ini−outi, i n i in_i ini是点 i i i的总流入量, o u t i out_i outi是点 i i i的总流出量。于是可以按照如下方式建立附加流。虽然原图无源汇点,但此时需要建立出附加流上的源汇点 S S SS SS, T T TT TT(满足上界限制需要,称为 S S , T T SS,TT SS,TT便于与下文有源汇点的问题区分)。
考虑三种情况:
- a i = 0 a_i=0 ai=0,初始流流量守恒,附加流也流量守恒,故不做处理。
- a i > 0 a_i>0 a