Ford-Fulkerson方法中的容量缩放(Capacity Scaling)优化
字数 1878 2025-10-28 20:05:13

Ford-Fulkerson方法中的容量缩放(Capacity Scaling)优化

题目描述
给定一个有向图,表示一个流网络。其中每条边有一个非负容量。流网络有一个源点s和一个汇点t。目标是找到从s到t的最大流。Ford-Fulkerson方法通过不断寻找增广路径来增加流,但基础版本可能效率较低,尤其是在选择增广路径不当时。容量缩放(Capacity Scaling)是Ford-Fulkerson方法的一种优化,通过优先考虑容量较大的边,减少增广次数,从而提高算法效率,特别是在边容量差异较大时。

解题过程

  1. 理解基本概念

    • 流网络:有向图G=(V,E),每条边(u,v)有容量c(u,v)≥0,源点s,汇点t。
    • 流:函数f: E→R,满足容量限制(f(u,v)≤c(u,v))和流量守恒(除s和t外,流入等于流出)。
    • 残量网络:对于当前流f,残量容量c_f(u,v) = c(u,v) - f(u,v)(如果边存在),加上反向边容量f(v,u)(允许撤销流)。
    • 增广路径:残量网络中从s到t的路径,路径上最小残量容量称为瓶颈容量。
  2. 容量缩放的核心思想

    • 引入缩放参数Δ,初始时Δ设为大于最大容量的最小2的幂(如max capacity=10,则Δ=16)。
    • 在残量网络中,仅考虑残量容量≥Δ的边,构建“Δ-残量网络”。
    • 优先寻找Δ-残量网络中的增广路径,确保每次增广的流量至少为Δ,从而减少增广次数。
    • 每轮缩放结束后,将Δ减半(Δ = Δ/2),重复过程直到Δ=0。
  3. 算法步骤详解
    步骤1:初始化

    • 设置初始流f为0。
    • 计算Δ₀ = 2^⌊log₂U⌋,其中U是图中最大边容量。例如,若最大容量为10,则Δ₀=8(2^3)。

    步骤2:缩放阶段循环(当Δ≥1时)

    • 构建当前Δ-残量网络:只保留残量容量≥Δ的边。
    • 在Δ-残量网络中,使用BFS或DFS寻找从s到t的增广路径:
      • 若找到路径p,计算瓶颈容量(路径上最小残量容量),更新流f:沿路径增加瓶颈容量的流量,同时更新残量网络(减少正向边容量,增加反向边容量)。
      • 重复寻找增广路径,直到当前Δ-残量网络中不存在s到t的路径。
    • Δ = Δ / 2(整数除法)。

    步骤3:终止

    • 当Δ=0时,算法结束,当前流f即为最大流。
  4. 示例说明
    假设网络有边:s→A(容量12),s→B(容量10),A→t(容量8),B→t(容量9),A→B(容量4)。

    • 初始化:Δ=8(最大容量12,log₂12≈3.58,取⌊3.58⌋=3,2^3=8),流f=0。
    • Δ=8阶段
      • Δ-残量网络包含边s→A(残量12≥8)、A→t(8≥8)、s→B(10≥8)、B→t(9≥8)。忽略A→B(4<8)。
      • 找到增广路径s→A→t,瓶颈容量=8,更新流:f(s,A)=8, f(A,t)=8。
      • 残量网络更新:s→A残量4(<8,移除),A→t残量0(移除)。此时Δ-网络中无s到t路径,结束Δ=8阶段。
    • Δ=4阶段
      • Δ-残量网络包含s→B(10≥4)、B→t(9≥4)、A→B(4≥4,因反向边产生?注意:流更新后,残量边包括反向边A→s容量8、t→A容量8等,但当前仅考虑残量≥4的边)。
      • 详细残量网络:
        • 正向边:s→B残量10,B→t残量9,A→B残量4(原始容量4减流0)。
        • 反向边:A→s残量8(≥4),t→A残量8(≥4)。
      • 路径s→B→t:瓶颈容量=9,但Δ=4,故可增广流量4?实际中取min(瓶颈, Δ)不必要,因Δ-网络已限制边。正确操作:在Δ-网络中直接找路径,瓶颈由路径边最小残量决定。
        • 路径s→B→t:残量min(10,9)=9≥4,增广流量9,更新流f(s,B)=9, f(B,t)=9。
      • 更新后,Δ=4阶段结束。
    • 继续Δ=2,1阶段,直到无法增广。最终最大流=17(s输出:8+9=17,t输入:8+9=17)。
  5. 为什么容量缩放有效

    • 每轮缩放阶段,增广路径的流量至少为Δ,确保增广次数最多为O(|E|) per Δ-phase(因每条边可能被饱和一次)。
    • 缩放次数为O(logU),总时间复杂度O(|E|² logU),优于基础Ford-Fulkerson的O(|E|·f_max)(当流值大时效率差)。
  6. 注意事项

    • 构建Δ-残量网络时,需包含残量容量≥Δ的正向边和反向边。
    • 使用BFS(即Edmonds-Karp变体)可保证找到最短增广路径,避免无限循环。

总结
容量缩放通过优先处理高容量边,系统性地减少增广次数,是Ford-Fulkerson家族的高效实用变体,适用于容量范围大的网络。

Ford-Fulkerson方法中的容量缩放(Capacity Scaling)优化 题目描述 给定一个有向图,表示一个流网络。其中每条边有一个非负容量。流网络有一个源点s和一个汇点t。目标是找到从s到t的最大流。Ford-Fulkerson方法通过不断寻找增广路径来增加流,但基础版本可能效率较低,尤其是在选择增广路径不当时。容量缩放(Capacity Scaling)是Ford-Fulkerson方法的一种优化,通过优先考虑容量较大的边,减少增广次数,从而提高算法效率,特别是在边容量差异较大时。 解题过程 理解基本概念 流网络:有向图G=(V,E),每条边(u,v)有容量c(u,v)≥0,源点s,汇点t。 流:函数f: E→R,满足容量限制(f(u,v)≤c(u,v))和流量守恒(除s和t外,流入等于流出)。 残量网络:对于当前流f,残量容量c_ f(u,v) = c(u,v) - f(u,v)(如果边存在),加上反向边容量f(v,u)(允许撤销流)。 增广路径:残量网络中从s到t的路径,路径上最小残量容量称为瓶颈容量。 容量缩放的核心思想 引入缩放参数Δ,初始时Δ设为大于最大容量的最小2的幂(如max capacity=10,则Δ=16)。 在残量网络中,仅考虑残量容量≥Δ的边,构建“Δ-残量网络”。 优先寻找Δ-残量网络中的增广路径,确保每次增广的流量至少为Δ,从而减少增广次数。 每轮缩放结束后,将Δ减半(Δ = Δ/2),重复过程直到Δ=0。 算法步骤详解 步骤1:初始化 设置初始流f为0。 计算Δ₀ = 2^⌊log₂U⌋,其中U是图中最大边容量。例如,若最大容量为10,则Δ₀=8(2^3)。 步骤2:缩放阶段循环(当Δ≥1时) 构建当前Δ-残量网络:只保留残量容量≥Δ的边。 在Δ-残量网络中,使用BFS或DFS寻找从s到t的增广路径: 若找到路径p,计算瓶颈容量(路径上最小残量容量),更新流f:沿路径增加瓶颈容量的流量,同时更新残量网络(减少正向边容量,增加反向边容量)。 重复寻找增广路径,直到当前Δ-残量网络中不存在s到t的路径。 Δ = Δ / 2(整数除法)。 步骤3:终止 当Δ=0时,算法结束,当前流f即为最大流。 示例说明 假设网络有边:s→A(容量12),s→B(容量10),A→t(容量8),B→t(容量9),A→B(容量4)。 初始化:Δ=8(最大容量12,log₂12≈3.58,取⌊3.58⌋=3,2^3=8),流f=0。 Δ=8阶段 : Δ-残量网络包含边s→A(残量12≥8)、A→t(8≥8)、s→B(10≥8)、B→t(9≥8)。忽略A→B(4 <8)。 找到增广路径s→A→t,瓶颈容量=8,更新流:f(s,A)=8, f(A,t)=8。 残量网络更新:s→A残量4( <8,移除),A→t残量0(移除)。此时Δ-网络中无s到t路径,结束Δ=8阶段。 Δ=4阶段 : Δ-残量网络包含s→B(10≥4)、B→t(9≥4)、A→B(4≥4,因反向边产生?注意:流更新后,残量边包括反向边A→s容量8、t→A容量8等,但当前仅考虑残量≥4的边)。 详细残量网络: 正向边:s→B残量10,B→t残量9,A→B残量4(原始容量4减流0)。 反向边:A→s残量8(≥4),t→A残量8(≥4)。 路径s→B→t:瓶颈容量=9,但Δ=4,故可增广流量4?实际中取min(瓶颈, Δ)不必要,因Δ-网络已限制边。正确操作:在Δ-网络中直接找路径,瓶颈由路径边最小残量决定。 路径s→B→t:残量min(10,9)=9≥4,增广流量9,更新流f(s,B)=9, f(B,t)=9。 更新后,Δ=4阶段结束。 继续Δ=2,1阶段,直到无法增广。最终最大流=17(s输出:8+9=17,t输入:8+9=17)。 为什么容量缩放有效 每轮缩放阶段,增广路径的流量至少为Δ,确保增广次数最多为O(|E|) per Δ-phase(因每条边可能被饱和一次)。 缩放次数为O(logU),总时间复杂度O(|E|² logU),优于基础Ford-Fulkerson的O(|E|·f_ max)(当流值大时效率差)。 注意事项 构建Δ-残量网络时,需包含残量容量≥Δ的正向边和反向边。 使用BFS(即Edmonds-Karp变体)可保证找到最短增广路径,避免无限循环。 总结 容量缩放通过优先处理高容量边,系统性地减少增广次数,是Ford-Fulkerson家族的高效实用变体,适用于容量范围大的网络。