流网络浅析 By ACReaper

来源:互联网 发布:迅雷cookie制作linux版 编辑:程序博客网 时间:2024/05/01 11:56

关于网络流,整整花了我一天时间,才看懂它再讲解什么,为了让初学者能更好理解,我打算写篇关于流网络的文章。


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


 


原创粉丝点击