最大流和最小割的关系
他们相等
这不废话吗
不过这篇文章主要讨论一些细节问题。
Part 0 残量网络?
区分两个概念:边、流函数。
前者是原图的一部分,信息包括流量、容量和端点,在数据结构中对应的变量是 flw
,cap
,u
,v
,并且要注意反向边不是原图的一部分,他们的变量不算在内
后者是残量网络的一部分,残量网络中的一条边就是一个流函数,信息包括端点、残量,其中残量在数据结构中对应的表达式是 cap-flw
,所有的反向边都属于残量网络,必须算在内。
数据结构中存储的“反向边”不能看做原图中存在的边(因为它的容量为零),它们只是为了更方便的描述流函数添加上的。正向边与反向边应当看做一条无向边的两个组成部分,而不是两条独立的边。
反向边为什么会和正向边有着完全一样的变量?这是为了实现方便做出的妥协,因为我们的数据结构中实际上把原图和残量网络存在了一起,所以残量网络的信息只能通过原图信息进行运算得来。
感性理解:【原图】=【所有的【正向边+反向边二元组】组成的集合+点集】;【残量网络】=【【所有正向边】+【所有反向边】+点集】
一定要区分【\((u,v)\) 这条边的反向边】和【原图中存在的边 \((v,u)\)】。
反向边中的负流不能看做流了一个“负的流”,因为这样就和正向边里面的流叠加起来,变成了二倍的流,这是万万不可的。所以反向边中的“负流”应当看做“正向边中的流”的另一种体现形式。
然后,我们在算法中频繁提及的“增广路”,指的是残量网络上【由残量大于零的边组成的一条路径】,而不是原图上【由未流满的边组成的一条路径】,因为后者不能用来退流。
Part 1 证明
尝试证明最大流等于最小割。
首先,假如图中存在一个流(不一定最大)因为最小割把整张图分成了两个部分,所以割边由【源点所在子图】流向【汇点所在子图】的净流量之和就一定等于这个流。
常见误区:反向边的流量不是负的吗?为什么不会相加等于零呢?
解决方法:定义
所以我们的思路很简单,找到最小割,然后证明这里面的所有边一定被最大流流满。
把最小割中和源点联通的子图叫做 \(S\),和汇点联通的子图叫做 \(T\),那么因为残量网络中不存在增广路径,所以所有由 \(S\) 连向 \(T\) 的边一定是满流,所有由 \(T\) 连向 \(S\) 的边一定是零流或者负流。得证。
Part 2 必须边与可行边
定义可行边为一条在某个最小割方案中出现过的边。(所有最小割的并集的元素)
定义必须边为一条在所有最小割方案中都必须出现的边。(所有最小割的交集的元素)
一个性质:简单推导可以知道,如果把一条可行边权值减少,那么最小割也会相应减少,如果把一条必须边权值增大,最小割权值也会相应增大。
首先,根据刚刚的证明,我们可以知道最小割中的每一条边在原图中一定被流满,也就是说残量网络中仅存在和原边反向的边,而不存在与它同向的边。
然后我们发现,如果有一条增广路,可以从这条有向边在原图上的起点走向终点,那么这一条边一定不会是可行边。
因为这条边权值减少(变为零)后,最小割的大小不会变小相同的幅度。
所以我们把残量网络强联通缩点,一条缩点后的DAG边一定是一条可行边,反之亦然。
必须边呢?简单考虑一下,如果要保证一条边没有“替代方案”,那么他一定直接连接了 \(s\) 和 \(t\) 所在的强连通分量。
Part 3 最小割的最小边数
把原图中满流边的容量全部设置为 \(1\),其余的设置成 \(+\infty\),然后跑最小割。
怎么证明?很简单啊,因为满流边组成的数量最小割一定是最小割。
这又怎么证明呢?考虑反证,假如说有一条不是可行边但是满流的边出现在了方案中,那么这条边的前后一定有另外的几条边被割掉,保证了它不会被流到。而这显然和割的数量最小性矛盾。