最大流问题(Edmonds-Karp 算法)
字数 1280 2025-11-28 21:53:43

最大流问题(Edmonds-Karp 算法)

题目描述
给定一个有向图,其中每条边有一个非负容量(capacity),以及一个源点(source)和一个汇点(sink),求从源点到汇点的最大流量。流量需满足以下约束:

  1. 容量限制:每条边上的流量不能超过其容量。
  2. 流量守恒:除源点和汇点外,每个顶点的流入流量等于流出流量。

Edmonds-Karp 算法是 Ford-Fulkerson 方法的一种实现,通过 广度优先搜索(BFS) 寻找增广路径,确保每次找到的增广路径是 最短路径(边数最少),从而保证算法的高效性。


解题过程

1. 基本概念

  • 残留网络(Residual Graph):在原图的基础上,为每条边添加一条反向边,容量初始为 0。当正向边有流量 \(f\) 通过时,正向边容量减少 \(f\),反向边容量增加 \(f\)。残留网络中的边容量表示该边还能承载的流量。
  • 增广路径(Augmenting Path):在残留网络中,从源点到汇点的一条路径,路径上所有边的容量均大于 0。通过该路径可以增加流量。

2. 算法步骤

  • 步骤 1:初始化流量为 0,构建残留网络(初始时与原图相同,反向边容量为 0)。
  • 步骤 2:在残留网络中使用 BFS 寻找从源点到汇点的最短路径(边数最少)。
    • 如果找不到路径,算法结束,当前流量即为最大流。
    • 如果找到路径,进入步骤 3。
  • 步骤 3:计算路径上的最小容量(瓶颈容量),记为 \(f\)
    • 将路径上每条正向边的容量减少 \(f\),反向边容量增加 \(f\)
    • 总流量增加 \(f\)
  • 步骤 4:重复步骤 2 和 3,直到无法找到增广路径。

3. 举例说明
假设有下图(边上的数字表示容量):

    A --3--> B
  /           \
s               t
  \           /
    C --5--> D

源点 \(s\),汇点 \(t\),边:\(s \to A\)(容量 3),\(s \to C\)(容量 5),\(A \to B\)(容量 3),\(C \to D\)(容量 5),\(B \to t\)(容量 3),\(D \to t\)(容量 5)。

迭代 1

  • BFS 找到路径 \(s \to A \to B \to t\),瓶颈容量为 3。
  • 更新流量:路径上的边容量减少 3,反向边容量增加 3。
  • 当前总流量 = 3。

迭代 2

  • BFS 找到路径 \(s \to C \to D \to t\),瓶颈容量为 5。
  • 更新流量,总流量变为 8。

迭代 3

  • 残留网络中无法找到从 \(s\)\(t\) 的路径,算法结束。
  • 最大流 = 8。

4. 为什么使用 BFS?

  • BFS 保证每次找到的增广路径是最短路径,避免 Ford-Fulkerson 在某些情况下陷入低效(如边容量为无理数时)。
  • 时间复杂度为 \(O(V E^2)\),其中 \(V\) 是顶点数,\(E\) 是边数。

5. 关键点

  • 反向边允许“撤销”流量,为后续增广路径提供调整机会。
  • 算法终止时,最小割的容量等于最大流(最大流最小割定理)。

通过以上步骤,Edmonds-Karp 算法能高效求解最大流问题。

最大流问题(Edmonds-Karp 算法) 题目描述 给定一个有向图,其中每条边有一个非负容量(capacity),以及一个源点(source)和一个汇点(sink),求从源点到汇点的最大流量。流量需满足以下约束: 容量限制:每条边上的流量不能超过其容量。 流量守恒:除源点和汇点外,每个顶点的流入流量等于流出流量。 Edmonds-Karp 算法是 Ford-Fulkerson 方法的一种实现,通过 广度优先搜索(BFS) 寻找增广路径,确保每次找到的增广路径是 最短路径(边数最少) ,从而保证算法的高效性。 解题过程 1. 基本概念 残留网络(Residual Graph) :在原图的基础上,为每条边添加一条反向边,容量初始为 0。当正向边有流量 \(f\) 通过时,正向边容量减少 \(f\),反向边容量增加 \(f\)。残留网络中的边容量表示该边还能承载的流量。 增广路径(Augmenting Path) :在残留网络中,从源点到汇点的一条路径,路径上所有边的容量均大于 0。通过该路径可以增加流量。 2. 算法步骤 步骤 1 :初始化流量为 0,构建残留网络(初始时与原图相同,反向边容量为 0)。 步骤 2 :在残留网络中使用 BFS 寻找从源点到汇点的最短路径(边数最少)。 如果找不到路径,算法结束,当前流量即为最大流。 如果找到路径,进入步骤 3。 步骤 3 :计算路径上的最小容量(瓶颈容量),记为 \(f\)。 将路径上每条正向边的容量减少 \(f\),反向边容量增加 \(f\)。 总流量增加 \(f\)。 步骤 4 :重复步骤 2 和 3,直到无法找到增广路径。 3. 举例说明 假设有下图(边上的数字表示容量): 源点 \(s\),汇点 \(t\),边:\(s \to A\)(容量 3),\(s \to C\)(容量 5),\(A \to B\)(容量 3),\(C \to D\)(容量 5),\(B \to t\)(容量 3),\(D \to t\)(容量 5)。 迭代 1 : BFS 找到路径 \(s \to A \to B \to t\),瓶颈容量为 3。 更新流量:路径上的边容量减少 3,反向边容量增加 3。 当前总流量 = 3。 迭代 2 : BFS 找到路径 \(s \to C \to D \to t\),瓶颈容量为 5。 更新流量,总流量变为 8。 迭代 3 : 残留网络中无法找到从 \(s\) 到 \(t\) 的路径,算法结束。 最大流 = 8。 4. 为什么使用 BFS? BFS 保证每次找到的增广路径是最短路径,避免 Ford-Fulkerson 在某些情况下陷入低效(如边容量为无理数时)。 时间复杂度为 \(O(V E^2)\),其中 \(V\) 是顶点数,\(E\) 是边数。 5. 关键点 反向边允许“撤销”流量,为后续增广路径提供调整机会。 算法终止时,最小割的容量等于最大流(最大流最小割定理)。 通过以上步骤,Edmonds-Karp 算法能高效求解最大流问题。