网络流基础 (转自mindlee.net)

将每条有向边想象成传输物质的管道。每个管道都有一个固定的容量,可以看作是物质能流经该管道的最大速度(譬如可以想象为水流和河槽)。顶点是管道间的连接点,除了源点(S,Source)和汇点(T,Target)以外,物质只流经这些顶点。而不聚集在顶点中。
注:下文提到的数字,基本都可加单位 “单位流量”来理解。
网络流中的最大流研究的问题是:在不违背容量限制的条件下,把物质从源点传输到汇点的最大速率是多少?上边的图示中,还有些需要说明,设G = (V,E)是一个流网络,其容量函数为c(c(u, v),Capicity)。s 为源点,t 为汇点。G 的流是一个函数 f (Flow)。上图中每条边标记的是流网络的容量 c(u, v),右图中,G中的流 |f| = 19。图中只显示正网络流。如果 f(u,v) > 0,则标记(u,v)为 f(u,v)/ c(u,v)(斜杠仅仅用来区分流和容量,不表示相除)。如果 f(u,v)<= 0,边(u,v)只标记它的容量。譬如(s,v1)这条边,最大流量限制是16,但实际流过11,所以表示为11 / 16。
网络流算法要基于三种思想:残留网络(Residual Network),增广路径(Augmenting Path)和割(Cut)。

和开头同一个例子,上图,图(b)就是残留网络,仔细观察一下,应该就可以明白,譬如边(s,v1),从 s 到 v1 流过11,还剩5,所以残余容量是5,当然,流量是守恒的,所以反向从 v1 到 s 流过11。剩余的容量 + 反向平衡的流量共同构成了残留网络。对于名词“残留容量(Residual Capacity)”的定义:在不超过容量c(u,v)的条件下,从 u 到 v 之间可以压入的额外网络流量,就是(u,v)的残留容量(Residual Capacity),公式定义是:cf(u,v) = c(u,v) – f(u,v)。而残留网络Gf = (V,Ef)。
图(b),阴影覆盖的边为增广路径 p ,其残留容量为 cf(p) = cf(v2,v3) = 4。看图应该就可以大概理解什么是增广路了。看图可以发现 s 到 v2还可以通过 5,v2到v3还可以通过 4,v3到 t 还可以流 5,按照常识,也可得出,这条路径还可以再流过 4 的结论。而从 s 输送 4 到 t 的这条路就是增广路。"增广路径 p”的定义:p 为残留网络Gf中从 s 到 t 的一条简单路径。在不违反边的容量限制条件下,增广路径上的每条边(u,v)可以容纳从 u 到 v 的某额外正网络流。Starvae师兄在讲解增广路时,有一段通俗的描述:
假如有这么一条路,这条路从源点开始一直一段一段的连到了汇点,并且,这条路上的每一段都满足流量<容量,注意,是严格的<,而不是<=。那么,我们一定能找到这条路上的每一段的(容量-流量)的值当中的最小值delta。我们把这条路上每一段的流量都加上这个delta,一定可以保证这个流依然是可行流。这样我们就得到了一个更大的流,他的流量是之前的流量+delta,而这条路就叫做增广路。
另外,这里得出的,计算增广路流量的公式非常重要:cf(p) = min { cf(u,v):(u,v)在 p 上},因为最大流算法的核心基本也就是寻找增广路了。
最大流最小割定理:一个流是最大流,当且仅当它的残留网络不包含增广路径。

流网络的割(S,T)将V划分为 S 和 T = V – S两部分,使得 s ∈ S,t ∈ T。如果 f 是一个流,则穿过割 (S,T)的净流被定义为 f (S,T)。割(S,T)的容量为 c(S,T)。一个网络的最小割就是网络中所有割中最小容量的割。
上图中,流网络的割(S = {s,v1,v2},T = {v3,v4,t}),S中的顶点是黑色,T中的顶点是白色。穿越(S,T)的净流量为:f(v1,v3) + f(v2,v3) + f(v2,v4) = 12 + (-4) + 11 = 19;容量为:c(v1,v3) + c(v2,v4) = 12 + 14 = 26。可以看出,割的净流由双向的网络流组成。而割的容量仅由 S 到 T 的边计算而得。

还有一个很有重要的知识:反向边。如图(a),1是源点,4是汇点。很明显如果第一次迭代找到的增广路是1→2→4和1→3→4,则最大流是2,但是如果第一次迭代找到的增广路是1→2→3→4,那么流量只有1,如图(b)是残留网络,这时候,反向边就起作用了,由于反向边的原因,第二次迭代的时候,又找到一条增广路1→3→2→4。这样下来,总的流量还是2。还是Starvae师兄的解释:
当我们第二次的增广路走 3→2 这条反向边的时候,就相当于把 2→3 这条正向边已经是用了的流量给“退”了回去,不走 2→3 这条路,而改走从 2 点出发的其他的路也就是 2→4。(有人问如果这里没有 2→4 怎么办,这时假如没有 2→4 这条路的话,最终这条增广路也不会存在,因为他根本不能走到汇点)同时本来在 3→4 上的流量由 1→3→4 这条路来“接管”。而最终 2→3 这条路正向流量1,反向流量1,等于没有流量。反向边的作用就是给程序一个可以后悔的机会。
浙公网安备 33010602011771号