容量缩放算法是为了加快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可达的顶点集合
- 在
Δ
\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的流值大小。 - 在
Δ
\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) 2m∗m∗(1+⌊log2C⌋)=O(m2logC)。