求网络流的算法有很多,这两天刚开始学,先写一下网络流究竟是个什么东西吧。
在网络流中,v可以表示所有点的集合。
e可以表示边的集合。
而g=(v,e)就可以表示整个图。
在网络流中,s表示源点,t表示汇点。
在每条边(u,v)上,有容量c(u,v),流量f(u,v)。
在下面这幅图中,有左边的数字表示当前通道的流量,右边的数字可以表示当前通道的流量。
这幅图的出处就在图中了。
网络流还有三个性质:
容量限制(Capacity constraints)
f(u,v)<=c(u,v)一条边的流量不能大于其容量。
斜对称(Skew symmetry)
f(u,v)=-f(v,u)由u到v的净流必须是由v到u的净流的相反。
流守恒(Flow conservation)
除非u=s或u=t,否则流入该节点的流量和等于流出该节点的流量和。
残量网络*
定义r(u,v)为残量网络的流量。指的就是对于某一条边还能有多少流量经过。
这是上面图的一个残量网络。残量网络(如果网络中一条边的容量为0,则认为这条边不在残量网络中。
r(s,v1)=0,所以就不画出来了。另外举个例子:r(v1,s) = c(v1,s) – f(v1,s) = 0 – (-f(s,v1)) = f(s,v1) = 4.
其中像(v1,s)这样的边称为后向弧,它表示从v1到s还可以增加4单位的流量。
但是从v1到s不是和原网络中的弧的方向相反吗?显然“从v1到s还可以增加4单位流量”这条信息毫无意义。那么,有必要建立这些后向弧吗?
显然,第1个图中的画出来的不是一个最大流。
但是,如果我们把s -> v2 -> v1 -> t这条路径经过的弧的流量都增加2,就得到了该网络的最大流。
注意到这条路径经过了一条后向弧:(v2,v1)。
如果不设立后向弧,算法就不能发现这条路径。
**从本质上说,后向弧为算法纠正自己所犯的错误提供了可能性,它允许算法取消先前的错误的行为(让2单位的流从v1流到v2)
注意,后向弧只是概念上的,在程序中后向弧与前向弧并无区别.