网络流——容量缩放算法

容量缩放算法是为了加快Ford-Fulkerson算法推送流速度而设计的改进算法
核心思想:保持一个容量参数 Δ \Delta Δ,每阶段在剩余网络 G f G_f Gf中只保留容量 ≥ Δ \geq\Delta Δ的边,把这种剩余网络我们叫做 Δ \Delta Δ剩余网络,记作 G f ( Δ ) G_f(\Delta) Gf(Δ)
算法流程如下:
在这里插入图片描述
定理:容量缩放算法终止时, f f f是一个最大流
证明:

  • Δ = 1 \Delta = 1 Δ=1 G f ( Δ ) = G f G_f(\Delta) = G_f Gf(Δ)=Gf
  • 算法在 Δ = 1 \Delta =1 Δ=1终止时,没有增广路径
  • 当没有增广路径时得到的流为最大流

容量缩放算法时间复杂度分析

几个引理
①一共存在 1 + ⌊ l o g 2 C ⌋ 1+\lfloor log_2C\rfloor 1+log2C个尺度放缩阶段
因为我们初始化 C / 2 < Δ ≤ C C/2\lt\Delta\leq C C/2<ΔC,容量参数每次迭代按照2倍数减少。
②令 f f f为一个 Δ \Delta Δ放缩阶段结束时,得到的流,则 v a l ( f ∗ ) ≤ v a l ( f ) + m Δ val(f^*)\leq val(f)+m\Delta val(f)val(f)+mΔ Δ \Delta Δ为本阶段开始时的容量参数
我们令集合 A A A为剩余网络 G f ( Δ ) G_f(\Delta) Gf(Δ)中从源点 s s s可达的顶点集合

  1. Δ \Delta Δ放缩阶段,原网络中从 A A A B B B推送流,直到可推送流量小于 Δ \Delta Δ为止,即 c ( e ) − f ( e ) < Δ c(e)-f(e)\lt\Delta c(e)f(e)<Δ,变换一下
    f ( e ) > c ( e ) − Δ f(e)>c(e)-\Delta f(e)>c(e)Δ,其中 f ( e ) f(e) f(e)为由 A A A流向 B B B的流值大小。
  2. Δ \Delta Δ放缩阶段,原网络中从 B B B A A A推送流大小 f ( e ) f(e) f(e)小于 Δ \Delta Δ。反证,如果超过 Δ \Delta Δ,则剩余网络存在由 A A A指向 B B B容量大小超过 Δ \Delta Δ的边,则集合 A A A可以进一步扩展,不是我们当前的集合 A A A。即
    f ( e ) < Δ f(e)\lt \Delta f(e)<Δ,其中 f ( e ) f(e) f(e)为由 B B B流向 A A A的流值大小。
    在这里插入图片描述
    第二行放缩,是把被减数减少,减数增大。最后一项是集合 A A A到集合 B B B进出边总数最多为 m m m。任意割容量 ≥ \geq 最小割容量 ≥ \geq 最大流。即: v a l ( f ∗ ) ≤ v a l ( f ) + m Δ val(f^*)\leq val(f)+m\Delta val(f)val(f)+mΔ
    3. 每个放缩阶段,增广次数不超过 2 m 2m 2m次。
    上一个阶段结束时的流,可以看作下一个阶段的开始流 f f f,因此:
    考虑本阶段开始时的 Δ \Delta Δ,套用上一阶段结束时的引理2:
    v a l ( f ∗ ) ≤ v a l ( f ) + m ( 2 Δ ) val(f^*)\leq val(f)+m(2\Delta) val(f)val(f)+m(2Δ)
    说明在当前流 f f f情况下,最多再推送 m ( 2 Δ ) m(2\Delta) m(2Δ)一定可以达到甚至超过 Δ \Delta Δ剩余网络对应的最大流,又每次至少增广 Δ \Delta Δ个流,因此最多 2 m 2m 2m次一定能达到 Δ \Delta Δ剩余网络对应的最大流。

总结

一共存在 1 + ⌊ l o g 2 C ⌋ 1+\lfloor log_2C \rfloor 1+log2C个不同阶段的 Δ \Delta Δ剩余网络,每个剩余网络最多进行 2 m 2m 2m次增广,每次寻找增广路径需要 O ( n + m ) O(n+m) O(n+m),近似为 O ( m ) O(m) O(m)。总时间复杂度为: 2 m ∗ m ∗ ( 1 + ⌊ l o g 2 C ⌋ ) = O ( m 2 l o g C ) 2m*m*(1+\lfloor log_2C \rfloor) = O(m^2logC) 2mm(1+log2C)=O(m2logC)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值