【最大流】Ford-Fulkerson算法——算法设计与分析

这篇具有很好参考价值的文章主要介绍了【最大流】Ford-Fulkerson算法——算法设计与分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、问题定义

1.1 流网络

给定有向图 G = < V , E , C > G=<V,E,C> G=<V,E,C>,其被称为流网络:

  • 容量: ∀ e ∈ E , c ( e ) ≥ 0 \forall e \in E, c(e) \ge0 eE,c(e)0
  • 流量: ∀ e ∈ E , 0 ≤ f ( e ) ≤ c ( e ) \forall e \in E, 0 \leq f(e) \leq c(e) eE,0f(e)c(e)
  • 剩余容量: ∀ e ∈ E , c ( e ) − f ( e ) \forall e \in E, c(e)-f(e) eE,c(e)f(e)
  • 总流量: ∣ f ∣ = ∑ e out of s f ( e ) = ∑ e in to t f ( e ) |f|={\textstyle \sum_{\text{e out of s}}f(e) =\textstyle \sum_{\text{e in to t}}f(e) } f=e out of sf(e)=e in to tf(e) (总流量 = 源点流出量 = 汇点流入量)

fordfulkerson算法求最大流,算法设计与分析,算法,网络

1.2 最大流问题

输入:

​ ①有向图 G = < V , E , C > G=<V,E,C> G=<V,E,C>,其中, c ( e ) ∈ C c(e)\in C c(e)C表示边 e e e的容量

​ ②源点 s s s,汇点 t t t


输出:

​ 总流量 ∣ f ∣ |f| f

约束目标: m a x ∣ f ∣ = m a x ∑ e out of s f ( e ) max|f|=max {\textstyle \sum_{\text{e out of s}}f(e)} maxf=maxe out of sf(e)
​ 约束条件:
\quad 容量限制: 0 ≤ f ( e ) ≤ c ( e ) 0\leq f(e)\leq c(e) 0f(e)c(e) (边上的流量不能超过容量)
\quad 流量守恒: ∑ e in to v f ( e ) = ∑ e out of v f ( e ) {\textstyle \sum_{\text{e in to v}}f(e)} = {\textstyle \sum_{\text{e out of v}}f(e)} e in to vf(e)=e out of vf(e) (每个顶点进入和流出的流量和相等)



二、算法策略

2.1 算法引入

直观想法:

①对 ∀ e ∈ E \forall e \in E eE,初始化流量为 f ( e ) = 0 f(e)=0 f(e)=0

②寻找一条源点 s s s到汇点 t t t的路径 P P P,此路径上的每条边 e e e均满足 f ( e ) < c ( e ) f(e)<c(e) f(e)<c(e)

③按路径 P P P上最小剩余容量增加路径流量

④迭代寻找路径 P P P直至无法增加路径流量

例如,在下述所给流网络 G G G中,选择红线路径作为路径 P P P,并增加了11的流量:

fordfulkerson算法求最大流,算法设计与分析,算法,网络

如此迭代寻找 P P P,便可以得到解。

但是,显然该方法并不可以得到最优解,例如,当该流网络为如下状态时,

fordfulkerson算法求最大流,算法设计与分析,算法,网络

我们发现,按照直观策略,该网络不能再增加流量。但是如果我们稍作调整,

fordfulkerson算法求最大流,算法设计与分析,算法,网络

如此,我们便成功将网络的流量增加了1。

我们不妨观察一下,我们做了什么样的改动:我们将流量进行了重新分配,缩减了某些边 ( v 2 , v 3 ) (v_2,v_3) (v2,v3)的流量,并将其重新分配到别的边 ( v 2 , v 4 ) (v_2,v_4) (v2,v4)上,实际上,上述变动可以看作我们沿着下图中红色路径走了1个流量:

fordfulkerson算法求最大流,算法设计与分析,算法,网络

也就相当于,我们引入了一条返向边 ( v 3 , v 2 ) (v_3,v_2) (v3,v2),并发现,如果我们寻找路径时允许反向搜索,则可以增大总流量。

一旦引入了反向边,就需要考虑反向边的权重问题,如何定义正向边及反向边的权重以保证流量调整合理呢?做出以下规定:

反向边权重:描述可缩减流量的上限,即原始边上的流量 f ( e ) f(e) f(e)

正向边权重:描述可扩充流量的上限,即原始边上的剩余容量 c ( e ) − f ( e ) c(e)-f(e) c(e)f(e)

如此,由一条原始边可以生成两条正向、反向边,实现反向搜索,以此来帮助我们更好地寻找到使得总流量增加的路径 P P P

2.2 一些概念

接下来介绍几个概念,并按照上述思路,介绍Ford-Fulkerson算法。

2.2.1 残存网络

对于给定流网络 G = < V , E , C > G=<V,E,C> G=<V,E,C>和流量 f f f,可以得到残存网络 G f = < V , E f > G_f=<V,E_f> Gf=<V,Ef>,其中 ∀ c f ( e ) ∈ E f \forall c_f(e) \in E_f cf(e)Ef,其残存容量为:
c f ( e ) = { c ( e ) − f ( e ) e 为正向边 f ( e ) e 为反向边 c_f(e)=\left\{\begin{matrix}c(e)-f(e) & e为正向边\\ f(e)&e为反向边 \end{matrix}\right. cf(e)={c(e)f(e)f(e)e为正向边e为反向边
残存网络中存储的是容量信息(可扩充及可缩减上限),可以帮助我们快速地发现增广路径(包含返向边的路径)。

例如:

fordfulkerson算法求最大流,算法设计与分析,算法,网络

2.2.2 增广路径

给定流网络 G = < V , E , C > G=<V,E,C> G=<V,E,C>和流量 f f f,增广路径 p p p是残存网络 G f G_f Gf中一条从源点 s s s到汇点 t t t的简单路径(路径上顶点不重复)。

例如:

fordfulkerson算法求最大流,算法设计与分析,算法,网络

如果在残存网络中存在增广路径,则说明存在流量的进一步调整方式。

2.2.3 增广路径的残存容量

增广路径的残存容量指的是一条增广路径 p p p上各边残存容量的最小值,即$c_f§=\min\left { c_f(e)|e\in p \right } $

fordfulkerson算法求最大流,算法设计与分析,算法,网络

增广路径的残存容量实际上就是沿着该路径流量扩充的最大值。


2.3 Ford-Fulkerson算法

接下来只需要对我们的只管策略做一些改动,便可以得到Ford-Fulkerson算法:

①对 ∀ e ∈ E \forall e \in E eE,初始化流量为 f ( e ) = 0 f(e)=0 f(e)=0

②构造残存网络 G f G_f Gf,寻找源点 s s s到汇点 t t t的增广路径 p p p

③按增广路径 p p p的残存容量增加路径流量

④迭代寻找路径 p p p直至无法增加路径流量

接下来以一个实例来展示该算法:

①流网络 G G G初始化,构造残存网络 G f G_f Gf

fordfulkerson算法求最大流,算法设计与分析,算法,网络

②在残存网络 G f G_f Gf中找到一条增广路径,并按照其容量更新流网络 G G G

fordfulkerson算法求最大流,算法设计与分析,算法,网络

③更新残存网络 G f G_f Gf

fordfulkerson算法求最大流,算法设计与分析,算法,网络

④重复②③:

fordfulkerson算法求最大流,算法设计与分析,算法,网络

fordfulkerson算法求最大流,算法设计与分析,算法,网络

fordfulkerson算法求最大流,算法设计与分析,算法,网络

fordfulkerson算法求最大流,算法设计与分析,算法,网络

⑤不能找出增广路径 p p p,算法结束:

fordfulkerson算法求最大流,算法设计与分析,算法,网络


2.4 算法分析

该算法的伪代码如下:

fordfulkerson算法求最大流,算法设计与分析,算法,网络

复杂度分析:

  • 初始化阶段: O ( E ) O(E) O(E)

  • 寻找增广路径:残存网络最多有 2 E 2E 2E条边,且 O ( V ) ≤ O ( E ) O(V)\leq O(E) O(V)O(E),使用DFS,可以在 O ( V + 2 E ) = O ( E ) O(V+2E)=O(E) O(V+2E)=O(E)的时间内找到增广路径

  • 找增广路径残存容量: O ( E ) O(E) O(E)

  • 更新流: O ( E ) O(E) O(E)

fordfulkerson算法求最大流,算法设计与分析,算法,网络

每次循环后,流的值至少会增加1,所以循环最多执行 ∣ f ∗ ∣ |f^*| f次,算法的时间复杂度为 O ( E ∣ f ∗ ∣ ) O(E|f*|) O(Ef)文章来源地址https://www.toymoban.com/news/detail-761022.html

实际上,该算法的运行时间主要受限于增广过程,对于同一个流网络 G G G,不同增广路径的选择,会对结果产生巨大的影响,例如:

fordfulkerson算法求最大流,算法设计与分析,算法,网络

每次循环后,流的值至少会增加1,所以循环最多执行 ∣ f ∗ ∣ |f^*| f次,算法的时间复杂度为 O ( E ∣ f ∗ ∣ ) O(E|f*|) O(Ef)

到了这里,关于【最大流】Ford-Fulkerson算法——算法设计与分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Bellman-ford 贝尔曼-福特算法

    Bellman-ford算法可以解决负权图的单源最短路径问题 --- 它的优点是可以解决有负权边的单源最短路径问题, 而且可以判断是否负权回路 它也有明显的缺点,它的时间复杂度O(N*E)(N是点数 , E是边数)普遍是要高于Dijkstra算法O(N^2)的,像这里,我们使用邻接矩阵实现,那

    2024年02月06日
    浏览(44)
  • 图论14-最短路径-Dijkstra算法+Bellman-Ford算法+Floyed算法

    https://github.com/Chufeng-Jiang/Graph-Theory/tree/main/src/Chapter11_Min_Path 2.4.1 判断某个顶点的连通性 2.4.2 求源点s到某个顶点的最短路径 存放节点编号和距离 这里的缺点就是,更新node时候,会重复添加节点相同的node,但是路径值不一样。不影响最后结果。 更新pre数组 输出路径 初始化两

    2024年02月04日
    浏览(36)
  • 最短路径算法 | Bellman-Ford Algorithm

    我们在之前的文章中已经讨论了最短路径算法中最经典的Dijkstra‘s Algorithm。然而,Dijkstra\\\'s Algorithm虽然好用,却仍然存在一些缺点即无法解决带有负权重路线的问题,改进后的Dijkstra算法尽管可以解决一些简单的负权重问题,但仍然无法解决带有负循环的图的最短路径问题。

    2024年02月08日
    浏览(51)
  • 最大子段和问题算法设计(C语言)

    编译环境:Dev-C++ 分别用暴力枚举,优化枚举,递归分治和动态规划的方法解决最大字段和问题。 给定n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列连续的子序列和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。 用一个三重循环,i和j从

    2023年04月09日
    浏览(36)
  • bellman_ford算法判负环-洛谷P3371

    总结:这题改了很久,一直wa 问题一:多测要清空数组 问题二:本题其实有点特殊,它要求的是,从1开始出发能到达的负环,也就是这个1实际上必须能到这个负环,如果图不连通,就会出现有负环但1去不了,等于没有负环的情况,这种特殊情况bellman_ford算法是压根没法解决的 一个玄学方法

    2024年02月06日
    浏览(38)
  • 图论最短路径——Bellman-Ford Algorithm算法

    在图论中,寻找最短路径是一个常见且重要的问题。对于这个问题,有许多算法可以解决,其中最著名的是 Dijkstra 算法。然而,当图中包含负权边时,Dijkstra 算法可能无法正确工作。这时,贝尔曼-福特(Bellman-Ford)算法就派上了用场。 贝尔曼-福特算法可以在含有负权边的图

    2024年04月27日
    浏览(38)
  • 图搜索算法详解 - DFS、BFS、Bellman-Ford、Dijkstra

    图搜索算法是许多应用程序的基础,例如社交网络分析、路径规划、数据挖掘和推荐系统。在本文中,我们将深入探讨图搜索算法的世界,探索它们的定义、重要性和实际应用。 图搜索算法是一种用于遍历图的技术,图是由 关系 连接的 节点集合 。在社交网络、网页或生物

    2024年02月16日
    浏览(42)
  • Bellman-Ford-贝尔曼-福特-算法求最短路-负环

    Bellman-Ford(贝尔曼-福特)算法基于松弛操作的单源最短路算法。 e[u]存u点的出边的邻点和边权,d[u]存u点到源点的距离。 初始化,ds]=0,d[其它点]=+o; 执行多轮循环。每轮循环,对所有边都尝试进行一次松弛操作; 当一轮循环中没有成功的松弛操作时,算法停止 为什么最坏需要

    2024年02月13日
    浏览(38)
  • 最短路径算法( Dijkstra + Bellman-Ford + SPFA + Floyd)

       文章目录 一、Dijkstra 算法 1、1 朴素版Dijkstra算法 1、1、1 Dijkstra求最短路 I 1、1、2 题解关键思路与与解答 1、2 堆优化版Dijkstra算法 1、2、1 Dijkstra求最短路 II 1、2、2 题解关键思路与答案 二、Bellman-Ford 算法 2、1 Bellman-Ford算法求有边数限制的最短路 2、1、1 题目描述 2、

    2023年04月08日
    浏览(37)
  • C++ | 数据结构与算法 | 单源最短路径 | Dijkstra && Bellman Ford

    (关于代码实现的图结构,可以看图结构的实现这篇文章) Dijkstra的实现与Prim的实现相似,两者都是通过贪心思想实现,它们有什么不同呢?首先Prim算法是针对无向图的最小生成树的,而Dijkstra算法是针对 有向图 的最短路径生成。一个的目的是连接图中的所有顶点,生成一

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包