网络流入门知识详解

转载博客

 

本图示最大流的一个实例。由此,可以引出最大流的一些基本的定义和概念

一:介绍

1、网络流的相关定义:

  • 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点
  • 汇点:另一个点也很特殊,只进不出,叫做汇点
  • 容量和流量:每条有向边上有两个量,容量和流量,从i到j的容量通常用c[i,j]表示,流量则通常是f[i,j].
  • 最大流:把源点比作工厂的话,问题就是求从工厂最大可以发出多少货物,是不至于超过道路的容量限制,也就是,最大流
  • 通常可以把这些边想象成水管道,流量就是这条道路的水流量,容量就是道路可承受的最大的水流量。
  • 很显然的,流量<=容量。
  • 而对于每个不是源点和汇点的点来说,可以类比的想象成没有存储功能的货物的中转站,所有“进入”他们的流量和等于所有从他本身“出去”的流量。
  • 那么,我们一定能找到这条路上的每一段的(容量-流量)的值当中的 最小值delta。我们把这条路上每一段的流量都加上这个delta,一定可以保证这个流依然是可行流,这是显然的。
  • 这样我们就得到了一个更大的流,他的流量是之前的 流量+delta ,而这条路就叫做增广路。我们不断地从起点开始寻找增广路,每次都对其进行增广,直到源点和汇点不连通,也就是找不到增广路为止。
  • 当找不到增广路的时候,当前的流量就是最大流,这个结论非常重要。

2、

 

3、一个最简单的例子就是,零流,即所有的流量都是0的流。

  • (1).我们就从这个 零流 开始考虑,假如有这么一条路,这条路从源点开始一直一段一段的连到了汇点,并且,这条路上的每一段都满足 流量 < 容量,注意,是严格的 <,而不是 <=(可以理解成如果等于容量的话,还得去考虑管道的生命力,先简单的理解一下趴)

4、引出最大流的概念

 

 

 

二、算法分析:

1、

 

所以说,算法的关键在于

1)何为增广路径,如何找出增广路径。

2)如何更新流量

 

2、增广矩阵的概念

( f(u,v)是当前的流量, c(u,v)是总的容量 )

说的直白些,所谓增广路径,就是找到这样一条路径,其流量不满,未达到容量上限。

所有的可能的增广路径在一起便构成了残留网络。

那么,如何增广呢。

 

3、增广路

简单解释一下:

第一步,计算可增加流量

设某一增广路径上的节点为(a1,a2,a3,a4,....,an)

如果(u,v)是正向边,则增加流量d = min{ c(ai,aj) - f(ai,aj) | j = i +1, i =1,2,3...,n-1}

如果是逆向边,则增加流量d = min{ f(ai, aj) | j = i +1, i =1,2,3...,n-1}

第二步,更新流量

如果(u,v)是正向边,则 f(u,v) = f(u,v) + d

是逆向边,则f(u,v) = f(u,v) - d

注意,如果是逆向边,就是减法,当前管道从中减去部分流量,而且,伴随着这部分减去的流量,必有另一部分管道的流量会增加,而且,最后的总流量增加了d

结合上述算法,可以详细参阅下下列图示

可以证明,可行流为最大流,当且仅当不存在新的增广路径。

总结一下最大流算法

如何寻找增广路径,采用DFS和BFS的方法。然后在更新流量。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值