多源点多汇点
我们已经介绍了如何求解恰有一个源点和一个汇点的网络流。那么,如果有多个源点和汇点,并且它们都有对应的最大流出容量和流入容量限制时该怎么做呢?答案很简单,只要增加一个超级源点
s
s
s和一个超级汇点
t
t
t,从
s
s
s 向每个源点连一条容量为对应最大流出容量的边,从每个汇点向
t
t
t连一条容量为对应最大流入容量的边。不过,如果源和汇之间存在对应关系(从不同源点流出的流要流入指定的汇点)时,是无法这样求解的。这种情况被称为多物网络流问题,尚未有已知的高效算法,这类问题也几乎不会出现在程序设计竞赛当中
无向图的情况
下面来考虑无向图的情况。此时的容量表示的是两个方向流量之和的上界。不过,如果两个方向都有流量,则与它们相互抵消之后是等价的,所以可以知道最大流中没有必要在两个方向都有流量。因此把无向图中容量为 c的一条边当作有向图中两个方向各有一条容量为 c的两条边,就能够得到同样的结果。
顶点有容量限制的情况
图中不光边上有容量限制,途中经过的顶点也有总流入量和总流出量的限制的情况应该如何处理呢?此时,我们可以把每个顶点拆成两个。拆点之后得到入顶点和出顶点,将指向原先顶点的边改成指向入顶点,将从原先顶点指出的边改成从出顶点指出。并且,再从入顶点向出顶点连容量为原先顶点容量的边,就可以把顶点上的容量限制转为边上的容量限制了。
有最小流量限制的情况
考虑一下不光有最大流量限制 c ( e ) c(e) c(e),还有最小流量限制 b ( e ) b(e) b(e),此时 b ( e ) ≤ f ( e ) ≤ c ( e ) b(e)\leq f(e)\leq c(e) b(e)≤f(e)≤c(e)。
解决方案:令 f ′ ( e ) = f ( e ) − b ( e ) f'(e)=f(e)-b(e) f′(e)=f(e)−b(e),此时就可以转化为只有最大流限制 0 ≤ f ′ ( e ) ≤ c ( e ) − b ( e ) 0\leq f'(e)\leq c(e)-b(e) 0≤f′(e)≤c(e)−b(e)的情况,而此时顶点对应的总流入量和总流出量的关系变为:流入的 f ′ ( e ) + b ( e ) f'(e)+b(e) f′(e)+b(e)等于流出的 f ′ ( e ) + b ( e ) f'(e)+b(e) f′(e)+b(e)。
此时可以看作是有一个最大流出量为
b
(
e
)
b(e)
b(e)的源点和一个最大流入量为
b
(
e
)
b(e)
b(e)的汇点与之相连。因此可以增加新的源点和汇点
S
S
S和
T
T
T,对于每条边
e
=
(
u
,
v
)
e=(u,v)
e=(u,v),令新的容量
c
′
(
e
)
=
c
(
e
)
−
b
(
e
)
c'(e)=c(e)-b(e)
c′(e)=c(e)−b(e),并从
S
S
S向
v
v
v连一条容量为
b
(
e
)
b(e)
b(e)的边,从
u
u
u向
T
T
T连一条容量为
b
(
e
)
b(e)
b(e)的边,并从
S
S
S向
s
s
s连接一条容量为无穷的边,从
t
t
t向
T
T
T连接一条容量为无穷的边,这样就转为了没有最小流量限制的情况。
图发生部分变化的情况
在某些问题中,求完某个图的最大流之后,需要对原图中的一部分做一些变化,再对新图求最大流。这种情况下,有时不需要重新计算最大流,而可以重复利用前一步的结果,高效地求出新的最大流。
容量为负数的情况
虽然在网络流问题中,通常不会有容量为负数的边。但是将问题转化为最小割时,有可能出现容量为负数的边。一般情况下,我们不能利用最大流算法来求解包含负容量边的图的最小割,也没有已知的有效算法。但有些情况下,可以采取适当的变形而避免出现负容量边。