最大流之Ford-Fulkerson和Edmonds-Karp算法

1. Ford-Fulkerson基本原理

Ford-Fulkerson 算法的基本思想是不断寻找从源点(source)到汇点(sink)的增广路径(augmenting path),这些路径通过所谓的残余网络来找到。每次找到一条增广路径后,就沿该路径推送尽可能多的流量,直到没有更多的增广路径,即无法再增加流量为止。

2. 算法步骤

  1. 初始化流网络:所有边的初始流量设置为0。
  2. 构建残余网络:对于每条边和其反向边,计算其残余容量。残余容量是指在不违背容量限制的前提下,能通过该边增加的最大流量。
  3. 搜索增广路径:使用深度优先搜索(DFS)或广度优先搜索(BFS)在残余网络中寻找从源点到汇点的路径。
  4. 调整流量:对找到的增广路径上的每条边,调整流量。流量的调整是基于增广路径上的最小残余容量(即路径上残余容量最小的边的容量),这就是此次增广能通过的最大流量。
  5. 更新残余网络:更新路径上边的残余容量,并添加或更新反向边的残余容量。
  6. 重复:重复步骤3-5,直到无法找到增广路径为止。

反向边:如果在原始网络中有从 u 到 v 的边,那么在残余网络中就会有从 v 到 u 的反向边,其残余容量表示可以从 v 到 u 回退多少流量。

3. 时间复杂度分析

Ford-Fulkerson 方法的效率依赖于找增广路径的方法。其时间复杂度最坏情况下可以达到 O(FE),这是因为每次增广可能只增加一个单位的流量,其中 E 是边的数量,F是最大流。


4. Edmonds-Karp基本原理

Edmonds-Karp 算法是 Ford-Fulkerson 方法的一个具体实现,该算法是在残余网络中通过 BFS 来寻找从源点到汇点的最短增广路径。这种方法确保了每次都能找到涉及边数最少的路径,这有助于更快地达到最大流,因为它减少了反复遍历同一路径的次数,从而避免了 Ford-Fulkerson 方法中可能的高复杂度。

5. 算法步骤

  1. 初始化流量:初始时,所有边的流量都设为0。
  2. 建立残余网络:根据当前的流量计算每条边的残余容量,并构建残余网络。
  3. 使用 BFS 寻找最短增广路径:从源点开始,使用 BFS 在残余网络中寻找到汇点的最短路径。最短指的是边的数量最少,这可以保证算法效率。
  4. 增广流量:通过找到的增广路径增加流量。增加的流量量是该路径上残余容量最小的边的容量。
  5. 更新残余网络:增加正向边的流量同时减少反向边的流量。
  6. 重复执行:重复步骤3-5,直到无法找到新的增广路径为止。

6. 效率分析

由于 Edmonds-Karp 算法使用 BFS 确保每次都寻找到的是最短的增广路径,这大大减少了在残余网络中的搜索次数。算法的时间复杂度是 O(VE^2),其中 V 是顶点数,E 是边数。

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值