网络流中的割是指S-T割,即一个边集合E,使得网络流中所有点被划分成2个集合,一个集合含起点S,一个含终点T。E中边的流量就是割,最小割就是使得E的流量最小。那么最小割为什么等于最大流?
直观理解:假设最大流为30,找一个割集,把网络流分割成了2部分,那现在最大流就是0了。相当于找的割集得把原来的流阻断,割要最小,就要恰好阻断所有流,如果割<30,说明一定存在一条S->T的路径有流,此时并没有把网络划分成2部分,所以割一定>=30,如果大于30了,说明有一部分割边把最大流30阻断了,然后有多余的边,多余的去了,就是最小割30了。
要找最小割集,就可以先ISAP跑一遍最大流,然后最小割集一定在满流的边中,先BFS一下,然后遍历满流的边,若2个顶点,一个Vis==true,一个vis==false,这条边就是割边之一。具体参考代码。 (可以想象在求最大流的时候,把一条路径上的所有边流量加m,然后至少一条边会满流,如果只有一条边满流,这条边就是割边之一,否则,说明有至少2边的残差相等,就可以通过跑BFS把多余的边识别出来)
网络流的基本概念
网络流问题都是建立在类似上图的有向图之上,有向图的边的权值代表容量。其中A代表源点,C代表汇点,一般考察的问题情景就是从A中流出流量,经过这些有向边,最终汇集到C中。像这样的具有源点和汇点,并且每条边的权值均为正数的有向图就被称作是容量网络,图中的这些边被称作是弧,弧的权值被称作弧的容量,它代表着能够通过这条弧的最大流量。而经过弧上的实际流量被称作弧的流量,所有这些弧的流量所组成的集合就是所谓的网络流。
直观上不难发现符合实际情况的网络流的特点,或者说是限制条件。首先每条弧上的流量不能超过其容量,还有对于除了源点和汇点以外的每个点来说,流入它的流量之和必须与从它流出的流量之和相等,即平衡条件。那么满足这两个条件的网络流就被称作是可行流,可行流的流量定义为从源点所流出的所有流量之和。在所有的可行流中,流量最大的那个被称作是最大流。
对于一串顶点序列(U,U1,U2,U3,…,V)(U,U1,U2,U3,…,V)(U,U1,U2,U3,…,V),如果满足UUU是源点,VVV是汇点,并且序列中每相邻两个顶点之间均存在一条弧,那么就称这个顶点序列为一条链,注意这里并不要求这条弧的方向一定与有向图中的方向一致,在链中,弧被分为前向弧和后向弧,前向弧指在链中顶点的顺序与容量网络中弧的方向一致的弧,而后向弧则是方向不一致的弧。例如对于上图而言,(A,D,B,C)(A,D,B,C)(A,D,B,C)也是一条链,但是其中<A,D>、<B,C><A,D>、<B,C><A,D>、<B,C>是前向弧,<D,B><D,B><D,B>是后向弧。
有了链的定义就可以引出增广路的概念,对于可行流的一条链PPP,如果满足:
1.PPP中所有的前向弧的流量小于容量
2.PPP中所有的后向弧的流量均大于零
那么这条链PPP就被称作增广路。为什么要叫作增广路呢?因为增广路上的所有前向弧都是可以继续添加流量的(增加的流量不能超过每条前向弧的容量与流量之差),而反向弧上的流量都是可以继续减少的(减少的流量不能超过反向弧的流量),这两种措施都会使得这个可行流的流量变得更大。
割指的是一个弧的集合,将这个集合中的所有弧删除后原图的基图不再连通。割将原图中的所有顶点划分为两个部分,在网络流问题中,一般考虑的都是S-T割:即割将原图的顶点划分为两个部分S和T,源点∈S,汇点∈T。例如对于上图,将顶点划分为S=(A,B)、T=(C,D)S=(A,B)、T=(C,D)S=(A,B)、T=(C,D)的这样一个割就是S-T割。
对于割而言,也有流量和容量的概念。割的容量用C(S,T)C(S,T)C(S,T)表示,C(S,T)=∑c(u,v)(u∈S、v∈T、<u,v>∈E)C(S,T)=\sum c(u,v) (u∈S、v∈T、<u,v>∈E)C(S,T)=∑c(u,v)(u∈S、v∈T、<u,v>∈E)(E代表容量网络所有弧的集合),简单来说割的容量就是SSS中的所有点到TTT中所有点的前向弧的容量之和。例如对上图而言,割S=(A,B)S=(A,B)S=(A,B)、T=(C,D)T=(C,D)T=(C,D)的容量为1+5+3=91+5+3=91+5+3=9。而对于割S=(A,D)S=(A,D)S=(A,D) T=(B,C)T=(B,C)T=(B,C),它的容量为:4+8=124+8=124+8=12。在所有的割中,容量最小的割被称作最小割。
而割的流量指的是前向弧的流量之和减去后向弧的流量之和。因此割的流量小于等于割的容量,当且仅当割所划分的两个点集中不存在后向弧时取等。
最大流最小割定理及证明
网络流的最大流和最小割具有非常重要的实际意义,而这两者之间有着非常重要的关系:最大流的流量=最小割的容量,这就是最大流最小割定理,下面就来证明这个定理。
命题1:对于可行流的任意一个割,割的流量=可行流的流量
证明:
采用归纳法来证明。设可行流的源点为VSV_SV
S
,汇点为VTV_TV
T
,割(S0,T0)(S_0,T_0)(S
0
,T
0
)将容量网络划分为T0={VT}T_0=\{ V_T \}T
0
={V
T
},S0S_0S
0
为除VTV_TV
T
外所有顶点的集合。对于这个割而言,割的流量就代表着流入汇点的所有流量之和,因此割(S0,T0)(S_0,T_0)(S
0
,T
0
)的流量就等于可行流的流量。
而其它的割都可以通过往T0T_0T
0
中逐步添加顶点来获取,向T0T_0T
0
中添加一个顶点VpV_pV
p
就意味着割的流量会减去VpV_pV
p
到T0T_0T
0
中所有顶点的流量之和,同时加上VpV_pV
p
到S0S_0S
0
中其余各顶点的流量之和,而由可行流的平衡条件可知,减少的流量和添加的流量是相等的,因此割的流量不发生改变,即所有割的流量=割(S0,T0)(S_0,T_0)(S
0
,T
0
)的流量=可行流的流量。
命题2:可行流的流量一定小于等于任意一个割的容量
证明:
由命题1显然可得:可行流的流量=割的流量≤割的容量
命题3:对于可行流G,设其流量为f,如下三个命题等价:
1.存在一个割使得割的容量c=f
2.f是最大流的流量
3.G中不存在任何增广路
证明:
1→21\to21→2:由命题2,任何一个可行流的流量都小于等于割的容量,即流量的上界是割的容量的最小值,而现在又存在一个割的容量ccc与fff相等,假设ccc不是最小割的容量,那么存在c0<cc_0<cc
0
<c,而又有c=f<c0c=f<c_0c=f<c
0
,因此推出了矛盾,即ccc一定是最小割的容量,fff达到了流量的上界,即fff是最大流的流量。
注意在证明这一点后是没法说明最大流最小割定理的,因为1推出2只能说明如果存在一个割的容量等于流量,这个流量就是最大流流量,此时最大流流量=最小割容量,但是并不能说明这样的一个割一定是存在的,要证明这一点必须要证明2能推出1。
2→32\to32→3:证明逆否命题:若G中存在增广路,则f不是最大流的流量。由前面增广路的定义可知,增广路上的每条前向弧都可以继续增加流量,后向弧可以继续减少流量,这两种措施都会导致最终的流量变大,因此f不是最大流的流量。
3→13\to13→1:G中不存在任何增广路,意味着由源点到汇点的任何一条链中一定存在饱和前向弧(流量=容量)或者零流后向弧(流量=0)。这说明如果只通过非饱和前向弧和非零流后向弧绝对不可能从源点运动到汇点,那么取割(S,T)(S,T)(S,T),其中SSS为源点能够通过非饱和前向弧和非零流后向弧到达的所有顶点构成的集合,T为剩下的点构成的集合,VS∈S、VT∈TV_S∈S、V_T∈TV
S
∈S、V
T
∈T。SSS中的所有点都不能通过非饱和前向弧和非零流后向弧到达TTT,也就是说SSS与TTT之间的弧一定都是饱和前向弧或者零流后向弧,割的流量=前向弧流量-后向弧流量=前向弧流量-0=前向弧流量=前向弧容量=割的容量。因此一定存在一个割,满足割的流量=割的容量。
由此就证明了这三个命题等价,同时论证了最大流最小割定理。
由此就不难想到求解最大流的算法,可以在可行流G中不断地寻找增广路,如果不存在增广路,此时可行流就是最大流;如果存在增广路,就在增广路上作修正。这样不断地迭代下去,知道不存在增广路为止。而影响性能的最重要的一个地方就是如何查找增广路,不同的查找方式会使的算法的复杂度不同,这些算法这将在下一篇中整理总结
————————————————
版权声明:本文为优快云博主「syddf_shadow」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/yjr3426619/article/details/82715779