通俗的讲讲求最大流的解法

缘由

这是阿里实习的一道选择题。我想用比较通俗的方式讲通它,目标就是下次如果出现了类似的求最大流的题,我能够快速的做出答案。所以让我们暂时忘了比较文绉绉的词语。
  1. 这篇博客以非常教科书的方式讲了解法,请参考:浅谈求解最大流的方法
  2. 更为权威您看参考:算法导论 第三版 P414

题干

下图图1中标出了每条有向公路最大流量,请问从S到T最大流量是( ). 
    A.46     B. 47     C. 54      D.77
通俗的讲讲求最大流的解法_第1张图片

通俗的解法

题干的意思

看看这个图,问题是问求最大流,其实猜也猜的出来就是从S到T,沿着各个节点传播东西。每个边上有数字,大概权重之类的东西,可以理解为限制,因为毕竟告诉我们要传播东西,又给了我们权重,又问最大 流,显然沿着每个边就不是无限的传播,而且有限的,那么这个数字就肯定就是每个边的所能传播的限制(我个人觉得凭直觉完全感觉得到)。
既然问了,最大流,为什么不就是将指向T的三个边的限制(术语叫容量)加起来不就好了吗?所以答案就是:23+36+18 吗?

但是实际上是不可能的,原因如下图:

通俗的讲讲求最大流的解法_第2张图片

如果要通过A点流入T点36,那么A点首先要收36点才能给T啊。但是A点能收到36吗?实际上是收不到的。因为A点总共才流进了19+12,31点。显然是不够的。所以这个问题其实是一种很复杂的问题。


算法导论中例子

因为如果题中给的节点和边比较多,所以我们需要更简单的图来讲清楚解决这个问题的办法。下面图一个求最大流的完整的解法的过程。
通俗的讲讲求最大流的解法_第3张图片

a行左边的图是起始,并且已经确定了一条传播路径,为什么选这一条,其实选择哪一条开始是没有关系的,因为会遍历所有的从S到T的路径。那么观察a行左边的图的路径,就会发现最多在这个路径上传播4,这是因为v4-t的限制,所以在a行右图,对这个图作了修改,每一个传播的边都写了4/16,4/12,4/9,4/4。这里的/不是除的意思,以4/16为例,是说在该路径上流过了4,而总容量是16。
到这里我们找到一条流通的路径了,我们将对应的边的箭头反过来,表示该节点已经确定会从被指节点处获得相应的流量,此时,需要注意,该箭头直线也具有传播的功能,而且是其限制就是其数字,因为我们只要少获得了,就相当于逆向传播了。按到这个说法,我们得到了b行作图,并且又随便选了一条传播路径(属于叫增广路径),选好了之后,我发现这条路径最多也只能流通4,这是因为v1到v2的限制。我们再综合之前的情况绘制了b行右图,这是目前我们确定之后的总的流量流动的情况。
我们再将该反的边反过来,形成了C行作图。其实意思都差不多了。也就随便找一条可传播的路径(术语:增广路径)。然后反复重复。

那什么时候是个头呢?你反复找啊找,最后就会发现到了f行作图,如下图,你根本无法找到一条传播路径了,这是因为v3节点已经没有流入了。所以e行右图就是最终结果。
通俗的讲讲求最大流的解法_第4张图片

本题解法

如果看懂了书中的例子,那么下图就是就是该题的解答过程。
通俗的讲讲求最大流的解法_第5张图片 通俗的讲讲求最大流的解法_第6张图片

最终结果在i图,就是 31+15 = 46
注意指向t的18那条边,其实没有流量流过,18表示最大限制。


后记

看懂算法书的上符号也是一种能力。而且是强大的能力。

你可能感兴趣的:(算法)