核心概述

Push–Relabel(Preflow-Push)最大流:基于“预流”和节点高度标签的最大流算法,反复在可行残量边上推送多余流量,不可推时提升高度;配合全局重标(global relabel)与 gap 启发能高效运行。最坏复杂度 O(V^3),实际表现优良。

原文引述

Description: Maximum flow via push–relabel (preflow–push) with heuristics like global relabel and gap. Maintains excess and height labels; discharges active vertices by pushing along admissible edges or relabeling. Time: O(V^3) worst-case; much faster in practice with heuristics Status: tested

展开阐述

  • 接口/数据结构(据实现)

    • PushRelabel(n):构造含 n 个点的流网络。
    • addEdge(u, v, cap):添加容量为 cap 的有向边,并加入反向边(容量 0)。
    • maxFlow(s, t):返回 s→t 的最大流量(64 位)。
    • 常见内部字段:
      • h[v]:高度标签(整数),初始 h[s]=n,h[其它]=0
      • excess[v]:顶点 v 的多余流量
      • g[v]:邻接边列表,边包含 to、rev、cap
      • 选择策略:最高标号(highest label)或队列/桶维护活跃点
  • 核心思路(预流 + 可行边 + 提升)

    • 预流:先将源点 s 的可行边尽量饱和,产生中间顶点的 excess。
    • 可行边(admissible):残量边 (u→v) 满足 h[u]=h[v]+1。
    • 推流(push):沿可行边推送 Δ=min(excess[u], cap(u,v));更新残量与 excess。
    • 提升(relabel):若 u 无可行边且 excess[u]>0,则令 h[u]=1+min{ h[v] | cap(u,v)>0 }。
    • 排放(discharge):对某活跃点 u 反复“推流或提升”,直到 excess[u]=0。
    • 启发式:
      • 全局重标(global relabel):定期从 t 在反向残量上 BFS,重置 h 为到 t 的层距(不可达置为大值),显著降低无效尝试。
      • gap 启发:若某高度 k 空缺,则对高度>k 的点可直接提到 ≥n+1 从而停用这些点。
      • 最高标号优先:优先排放高度最大的活跃点,减少无效边扫描。
  • 输出语义

    • 返回值:最大流量。
    • 若需恢复一个 s–t 最小割,可在终止时于残量图上从 s 做可达性,跨割边之和即最小割(见 074-图论-最小割)。
  • 复杂度

    • 理论最坏 O(V^3);带启发常见速度与 057-图论-Dinic最大流 相当或更优,尤其在稠密图上表现出色。
  • 使用与注意

    • 容量使用 64 位以避免溢出;addEdge 必须添加反向边。
    • 与 Dinic 相比,Push–Relabel 不依赖分层图;实现时注意 gap 与重标的触发频率。
    • 结果与 074-图论-最小割 对偶;若涉及费用请改用 073-图论-最小费用最大流

关联节点