文章结束给大家来个程序员笑话:[M]
关于网络流,整整花了我一天间时,才看懂它再讲授什么,为了让初学者能更好解理,我算打写篇关于流网络的文章。
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
文章结束给大家分享下程序员的一些笑话语录:
程序员喝酒
我偶尔采用“木马策略”、“交叉测试”,时间不长就开始“频繁分配释放资源”,“cache”也是免不了的了,
不过我从不搞“轮巡”,也不会“捕获异常”,更不会“程序异常”,因为我有理性
克制的。