在生活中,什么比较像图呢?答案一定不少吧,其中我想举的例子就是水管了。水管相互之间都是连通的,会构成一张图。从供水的一端出发,水必然沿一个固定的方向流向最终的汇聚点,也就是有向图。同时,在条件的限制下,水管有粗有细,不同的水管单位时间内的流水量限制是不同的,可以看做是带权图。
运输货物、限载限量、快递等等,是不是都很类似?我们称这样的带权、有向图为网络,因为有流量,即为网络流。具体定义就是,供应流量的出发点称为源点 S,接受流量的汇聚点称为汇点 T。比如下图就是一个网络,其中所标注的权值为这条边的容量——即可以流过的最大值。
最大流是网络流中最常见的问题,我们先来定义什么是可行流:要求每条边上流过的值不超过它的容量,且在每个点、边都不允许有 “ 积水 ”,即源点出去的流量 = 汇点收到的流量。最大流是求在所有的可行流中,流动的 “ 水 ” (流量)最多有多少。这确实是一个比较实际的问题,因为比如在水管系统中,我们都希望在水管不会出现任何故障的情况下,能够流过最多的水。
之前提到的网络中,看上去的最大流应该是 24,就是流入汇点的最大容量。但实际上的最大流如下图所示(红色的数表示流量),应该是 23,具体需要用算法来求解这个问题,一个比较直观的解释就是,容量为 12、7 和 4 这三条边已经都满流了,无法再增加流量。
求最大流的算法有很多,从上世纪五六十年代开始,到现在还一直有研究。关于网络流的其他问题也有不少,都非常有趣。其实,一些实际用网络流解决的题目,看上去和网络流没有任何关系。网络流单独出现的情况比较少见,多数还是需要和其它算法相结合解题,主要的难点在于问题模型的建立,以及把最大流等相关算法转化成正确的、有点长的代码等等。敬请期待我之后介绍的关于网络流的算法!