跳到主要内容

Flow & Cut 流与割算子集

算子类别:Flow & Cut(网络流与割)
描述:用于解决“最大能流多少 / 在哪些地方会成为瓶颈 / 切断网络最小代价是多少 / 任意两点之间的最小割结构”等问题,是网络容量分析、资源调度与系统韧性评估的核心算法族。


一、算子集概述

Flow & Cut 算子集主要围绕三类核心问题:

  1. 最大流(Max Flow)

    • 从源点到汇点,最多能通过多少流量?
    • 哪些边/节点会首先成为瓶颈?
  2. 最小割(Min Cut)

    • 至少切断哪些边(或容量)才能阻断连通?
    • 网络的“最薄弱位置”在哪里?
  3. 全局割结构

    • 任意两点之间的最小割是多少?
    • 是否能用一棵树压缩表示所有两两最小割?

二、算子列表

算子核心能力
edmonds_karp经典最大流算法,基于 BFS 的增广路径
shortest_augmenting_path最短增广路最大流,适合中高密度网络
preflow_push预流推进算法,适合高并发/高连接复杂网络
capacity_scaling容量分级的最小费用/最大流问题
gomory_hu_tree全对最小割结构的压缩表示(割树)

三、通用输入输出约定

3.1 输入

  • G:有向或无向图(部分算法仅适用于有向图)
  • capacity:边容量属性名(默认 "capacity"
  • s / t:源点与汇点(最大流相关算法)
  • demand / weight:最小费用流与容量分级问题使用

3.2 输出

  • 最大流算法:残量网络(Residual Network)或流值
  • 容量/费用算法:最优流方案 + 总成本
  • Gomory–Hu Tree:一棵无向树,编码所有两点最小割

四、算子详细说明

4.1 edmonds_karp —— 经典最大流算法

功能说明

基于 Ford–Fulkerson 方法,始终选择 最短(按边数)增广路径 来逐步增加从源点 s 到汇点 t 的流量。

适用场景

  • 中小规模网络的最大流计算
  • 教学、调试、可解释性强的流分析
  • 需要输出完整增广路径与残量网络的场景

参数要点

  • capacity:边容量属性
  • cutoff:提前终止阈值(达到某流量即停止)

原理与复杂度

  • 每次用 BFS 找增广路径
  • 时间复杂度O(V · E²)

可回答问题

  • 从 A 到 B 的最大运输能力是多少?
  • 哪些管道/链路在最大流下被完全占满?

4.2 shortest_augmenting_path —— 最短增广路最大流

功能说明

利用距离标号(distance labeling),优先选择“最短代价”的增广路径来提高效率。

适用场景

  • 中到大规模网络
  • 需要比 Edmonds–Karp 更快的最大流求解
  • 电信、交通、物流骨干网络

参数要点

  • two_phase:对单位容量网络显著加速
  • cutoff:最小可接受流量阈值

原理与复杂度

  • 基于最短路思想的增广路径搜索
  • 复杂度O(V² · E)(实际表现通常更优)

4.3 preflow_push —— 预流推进算法

功能说明

不要求中间节点流量守恒,允许“预流”,通过 Push / Relabel 操作逐步逼近最大流。

适用场景

  • 极其复杂、连通度高的大型网络
  • 高并发、高密度图(如数据中心、芯片布线)
  • 对性能要求极高的最大流计算

参数要点

  • global_relabel_freq:全局重标记频率(重要性能调优参数)
  • value_only:仅关心最大流值而不关心路径

原理与复杂度

  • 局部推进 + 高度标号
  • 复杂度O(V² · E)(实践中常优于路径型算法)

4.4 capacity_scaling —— 容量分级流算法

功能说明

按容量等级(Δ-scaling)逐步放大可用容量,解决 带需求(demand)与费用(cost)约束 的流问题。

适用场景

  • 供需平衡问题(多源多汇)
  • 成本最优的运输/调度问题
  • 能源、物流、云资源分配

参数要点

  • demand:节点需求属性(供给为负,需求为正)
  • capacity:边容量属性
  • weight:单位流量成本

原理与复杂度

  • 逐级放宽容量限制,寻找最优流
  • 复杂度O(E² log C)

4.5 gomory_hu_tree —— Gomory–Hu 割树

功能说明

一棵树 表示图中 任意两点之间的最小割值,支持快速两点割/流查询。

树上任意两点路径中的 最小边权 = 原图中这两点的最小割。

适用场景

  • 全局网络韧性分析
  • 找“最弱连接对”
  • 快速回答任意两点的最小割/最大流

参数要点

  • capacity:边容量属性
  • flow_func:底层最大流算法(稀疏图推荐 edmonds_karp,稠密图推荐 shortest_augmenting_path

原理与复杂度

  • 构造 n-1 次最大流
  • 复杂度O(V · MaxFlow)

五、选型指南(怎么选)

  • 想算 s → t 最大流(中小图)edmonds_karp
  • 想更快算最大流(较大图)shortest_augmenting_path
  • 极复杂高并发网络preflow_push
  • 有供需 + 成本约束capacity_scaling
  • 想一次性支持任意两点最小割查询gomory_hu_tree

六、可直接回答的典型问题

  • “这条网络从 A 到 B 的最大承载能力是多少?”
  • “哪些链路是系统的瓶颈?”
  • “最小代价切断系统需要破坏哪些连接?”
  • “任意两个节点之间,最少切掉多少容量才能隔离?”
  • “整个网络中,最脆弱的连接对是哪一组?”