【算法入门】最大网络流问题

 

一.网络与流

1.基本概念与术语

(1)网络:G是一个简单有向图,G=(V,E) 。满足三个条件:

     1)有一个源点S(入度为0:发点)

     2)有一个汇点T(出度为0:收点)

     3)每条边(?,?)都有一个非负容量cap(?,?)≥0

      满足上述条件的图G称为网络流图。

(2)网络流:定义在边集E上的一个非负函数

                                                                               flow=\begin{Bmatrix} flow(v,w) \end{Bmatrix}

(3)可行流:

     1)对每条边(v,w)\epsilon E,0\leq flow(v,w)\leq cap(v,w)

     2)对中间点:总流入量=总流出量\sum flow^-(v)=\sum flow^+(v)  

     3)对源点S:流出量=整个网络的流量\sum flow^+(v)=f

          对汇点T:流入量=整个网络的流量\sum flow^-(v)=f

(4)边流

 (5)最大流

       最大流问题即求网络G中的一个可行流,使其流量?达到最大

      ????满足

                                                                     0\leq flow(v,w)\leq cap(v,w), (v,w)\epsilon E

      且

                                                        \sum flow^+(v)-\sum flow^-(v)=\left\{\begin{matrix} f &v=s \\ 0 &v=s,t \\ -f&v=t \end{matrix}\right.

一个最大流

流量为10

二.增广路算法

1.基本思想

st的一条简单路径,若边(v,w)方向与该路径的方向一致,称(v,w)正向边,方向一不致时称为逆向边。 

 简单路:1\rightarrow3\rightarrow2\rightarrow4\rightarrow5 ,((1,2),(2,4),(4,5)正向边。(3,2)逆向边。

可增广路:

  1.所有正向边有:flow(v,w)< cap(v,w)

  2.所有反向边有:flow(v,w)>0

  可增广路是残流网路中一条容量大于0的路 

  设????是网络G中的一个可行流,如果不存从st关于flow可增广路,则flow网络G的一个最大流。

2.算法步骤

     1)使不属于可增广路的边(v,w)的流量保持不变。

     2)可增广路上的所有边(v,w)的流量按下述规则变化:

                在正向边(v,w)flow(v,w)+d

                在逆向边(v,w)上,flow(v,w)-d

                d=\begin{Bmatrix} cap(v,w)-flow(v,w),flow(w,v),d \end{Bmatrix}

例子:

   step1.开始时流量为:f=0

              找到一条增广路为(上图红色路径):1\rightarrow2\rightarrow3\rightarrow

              d=min\begin{Bmatrix} 4 ,&2 , &4 \end{Bmatrix}=2

              增加流量:2

   step2.增广一次后流量为:f=0+2=2

               

            找到 一条增广路为(上图红色路径): 1\rightarrow2\rightarrow4\rightarrow5

             d=min\begin{Bmatrix} 4-2, &3, &5 \end{Bmatrix}=2

             增加流量:2

   step3.增广两次后流量为:f=2+2=4

             

              找到一条增广路 为1\rightarrow3\rightarrow2\rightarrow4\rightarrow5

              d=min\begin{Bmatrix} 6, &2, &3-2, &5-2 \end{Bmatrix}=1

              增加流量:1

     step4.增广三次后流量为:f=4+1=5

 

                 找到一条增广路为:1\rightarrow3\rightarrow5

                d=min\begin{Bmatrix} 6-1, &4-2 \end{Bmatrix}=2

                 增加流量:2

     最后,得到最大流为:f=5+2=7

最大流量为7

算法的计算得杂性

增广路算法的效率由两个因素确定:

1)整个算法找可增广路的次数

2)每次找可增广路所需的时间

给定网络中有n个顶点和m条边,每条边的容量不超过M。易证明,增广路算法中找可增广路的次数不超过nM次。

对于最短增广路算法,最坏情况下计算时间为O(nm^2)O(n^3)

对于最大容量增广路算法,最坏情况下找可增广路次数不超过2mlog M

次,找一次需O(n log n)间,那么总计算时间为O(nm log n log M)O(n^2 log n log M)

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值