流网络浅析 By ACReaper
关于网络流,整整花了我一天时间,才看懂它再讲解什么,为了让初学者能更好理解,我打算写篇关于流网络的文章。
1.流之网络最大流模型
所谓的流网络其实也是图论的一部分,流网络是这样定义的,其每条边上都有两个值,一个称为flow流值,一个称为capacity,表示可通过的最大流值。
而,问题是这样的,在现实世界中,我们可以建立很多这样的模型,有一个起始点,我们称它为源点,还有一个点称为汇点,那么源点相当与现实世界中
的工厂,而汇点相当于仓库,每条边上可以看成是道路,而值capacity是这条路上所能流通的最大货物量,我们想求得能从源点发出的最大货量,而且汇点
所能接受到的最大货量等于源点发出的最大货量的值为多少,这就是流网络中的最大流模型!
在这个流网络中,我们同时又定义了一个函数f,表示流的函数,c表示容量函数,且有一下三条性质
1.f(x,y) <= c(x,y) 2.f(x,y) = -f(y,x), 3.在电脑上打不出来,即流入等于流出。
对于
1.很好理解。
2.的意思就是从x到y的流值,也可等价表示为重y到x的流的值的取负,这里f(x,y)可以为正,可以为负,可以为0.但是后面的c(x,y)一定是正的。
3.这个可以简单的这样理解,中间的结点都是中转结点,所以进来多上,可等要出去多少,不然在该结点就有积累,这样就不可能达到最大值,因为可以把这部分
积累的值转移到其它结点,这样总体的值必定不会小于原来有积累的值!
A。先在介绍一下残留网络,我在想这个名字真是难听!!!!!
所谓的残留网络其实是基于这样一个事实,就是我们想要知道每一条边还能在传送多少的流,我们把Cf表示为残留量其等于
Cf(x,y) = c(x,y) - f(x,y)。对于图中的两个任意结点,只要存在任意一个方向的边,那么求残留网络时就有两条边。
因为根据流网络的定义,如果边e 不属于边集E,则c(x,y) = 0,但是如果(y,x)属于边集,则就能求出两条边,一个是0 - f(y,x) = 0 + f(x,y)
另外一个是c(y,x) - f(y,x).这个是个难点注意理解了,这个里理解了也就差不多了。
B。增广路径
所谓的增广路,就是在残留网络的基础上,存在的简单路径(可能有多条),从s源点出发到汇点t。当然这条路径也要满足流网络的三个性质,也就是说
其实残留网络也是流网络!。还有当我们扩大流时,为要让每条边都能达到扩大的效果,必须取这条路上的最小C
即Cf(p) = min(cf(x,y):(x,y) is in p)
下面介绍Ford-Fulkerson方法,之所以不称他为算法,是因为实现这个方法所用的数据结构有多种。
Ford-Fulkerson(G,s,t){
initialize flow f to zero //初始化这个流网络的流为0
while there exist an augmenting path p//如果存在增广路p
do augment flow f along p//沿着这条增广路p扩大流f
return f;//返回流,此时的流就是最大流。
}
基本的Ford-FULKERSON算法
Ford-FULKERSON(G,s,t){
for each edge(u,v) 属于E(G)
do f(u,v) = f(v,u) = 0;
while there exists a path p frpm s to t in the residual network Gf//Gf就是残留网络
do Cf(p) = min(cf(u,v)
for each edge(u,v) in p
do f(u,v) = f(u,v ) + Cf(p)
f(v,u) = -f(u,v)
}
2013 05 02
By ACReaper