如何快速理解最大流和最小割

摘要:

割从哪来-------->最大流和最小割之间的等价关系的阐述。

1.问题引入

1.1思考这样一个问题:在给定的图中,如何判断一个源点s到终点t是否有路径存在呢?

我们首先想到的是用BFS或者是DFS算法对图进行遍历,如果可以返回一条从源点s到终点t的路径,那么就说明在图中是存在从s到t的路径的。但是如何证明当DFS或者BFS返回不了这样一条路径的时候,就不存在s到t的路径了呢?这证明起来就有点困难。
我们不妨这样想:
将所有的可能的s到t的路径全部都列出来:
如:
s,a,t
s,a,b,t
s,a,b,c,t
那么对于每一条可能的路径,如果这条路径存在,那么就说明路径中相邻节点对应的边肯定在图中是存在的。由此可以严格的证明图中是否存在s到t的路径。
方法的缺点:
但是这种方法对于节点比较少的时候还是可以的,对于节点比较多的图,显然没有可行性,比如,有一个1000个节点的中等大小的图,那么可能的路径就有至少2^998以上条,显然数据量太大了。
割集的诞生
上述方法不是普遍高效的方法,因此行不通。我们不妨这样想:
如果我把整个图中节点分成两个部分,一部分是源点s所在的集合S,一部分是终点t所在的集合T。
对于一条从s到t的路径,肯定要存在一对相邻的节点(u,v),其中u在S中,而v在T中。那么这两点所在的边肯定会从S中穿过集合的边界,到达T中,我们称这样的一条边为集合S和T的一个割。
那么上面的路径存在问题就可以描述为,不存在从集合S到集合T的一个割,也就是集合S,T的割为0!
bingo!!!第一个有关割的结论出来了:
若从S到T的割为0,则不存在s到t的路径,其中s∈S,t∈T。
好,下面我们把路径存在问题升级。

1.2思考这样一个问题:如何判定一个图中最多有多少条由源点s到终点t的不重合的路径?

上一个问题探讨的是是否存在路径,这次探讨的是存在最多多少条不重合路径
注意:只要由一条边同时出现在两条及以上路径中就算是重合的。
对于这个问题,我们先假设集合S合集合T都是比较理想的。我们可以由这个集合模型想到:

如果存在1条路径,那么会从集合S到T割数为1。
如果存在2条路径,那从S到T割数为2。
如果3条路径,那么S到T割数为3。
。。。

但是我们注意到,S和T中所包含节点具有不确定性,所以,你所选取的S和T可能不是图中最佳的。但是图中总存在最佳的S和T!!!并且你会发现,无论你怎么选取S和T,这两个集合的割,也就是通过这两个集合的边的数量总是大于等于最佳情况的数量,也就是你图中可能存在的最多的从s到t的路径的数量。
我们上面提到,你选取S和T的不同,会影响到你的割的数量的计算,并且割的数量总是大于等于最佳的S,T割的数量。那么这里就出来了第二个有关割的结论:
一个图中从s到t的路径最多不超过其S,T最小割的数量,其中s∈S,t∈T。

到这里,最小割就跟你见面了!!!!!!!!!!!!!

2.问题的深入

上面我们简单了解了割的有关知识,那么最小割是如何同最大流等价的呢?我们下面就来探讨这个问题。

2.1什么是流?最大流?

给你一个带权图,假设这个图是一个流水管道网络图。
图中的权就是你的管道所在边的最大的容量,而此时流经的水的量就是你的流量,简称流。
最大流,就是说,从s到t最多可以流多少水。
这里有一个点我们要特别注意:要从s到t!!!有路径的味道
比如:
如何快速理解最大流和最小割_第1张图片
那么我们会想,我直接看和t相连的边的权不就行了嘛qaq?
不行!!!!!表面上5+1 = 6,是充分利用了管道的容量,但是你注意:
s,a,t路径中,边s->a的权值为1,如果通5,那这条管子就撑坏了。
一旦这个图节点再多一些,连线再复杂一些,你就可想而知需要考虑到的边的容量有多复杂了。这也就是为什么这个最大流问题要作为一个专门的运筹学问题来解决,解决这个问题是要统筹全局的。
说了那么多废话,来说一下最小割和最大流之间的联系叭。

2.2最小割和最大流的联系

我们回忆一下刚才我们处理存在路径条数的问题的时候是不是只是说,这条边有没有穿过集合S到T?
我们只说了有没有,,这代表啥呢?代表我们默认边的权值是1了。
那边有权值了,又代表什么呢?代表有多个权值为1的边存在这两个节点之间!!!!!!

那么,咳咳,一个带权图,你就可以把它退化为所有边都是1的图,最大流问题就可以看成是最小割问题了,由于一条路径的流量是1(因为这条路上所有边的权值都是1,这是我们退化图的后果),那也就是找最多的不相交的路径的数量。

我们换一种说法:
在带权图中,如果我们把带权边分解为权值为1的边的叠加,最小割就是你通过两个理想的集合S,T的所有割之和最小。
也可以这么说:
带权图中的最小割,就是让所有带权割的权值之和最小

从宏观上我们可以这么理解:肯定要优先满足权值比较小的边啊,毕竟首先不能超过他们的最大值

但是,最小割这个定理只是给出了你路径存在数量的上限,也就是不超过那么多,如何证明你路径就是那么多呢?那就是你要找到这么多路径。
比如:
最小割=3说明不超过3条,这时候你如果在图中已经找到了3条不重合的路径,那说明你图中的路径数大于等于3,直接夹逼定理可以夹出来你图中的路径数就等于3

而求解图中最多可以存在多少条路径的问题,我们可以使用增广路算法。
算法还没仔细研究,不过其中有一点反人类的就是在进行路径修正的时候,要改正错误的路径,算法发明者就想到把整条已经找到的路径反过来,来实现更改错误这一举动。
仔细想想这个细节,其实在逻辑上也行得通,你正向是错的,那反过来就是对的。反过来找到的可行路径(注意容量的限制),也是可以应用的路径。也就是如果反过来已经找到的错误路径之后,你按照这个新图(称为残余网络)又找到了路径,那么可用路径条数就加一。
这个是有严格的证明的,证明也很牛,看懂了你就会啊啊啊啊啊啊,这证明真牛皮。不多阐述,以后更新。

你可能感兴趣的:(数据结构与算法)