FORD-FULKERSON算法

2023-05-16

目录

  • 流网络
  • 残留网络
  • 增广路径
  • 流网络的割
  • Ford-Fulkerson方法
  • 代码实现

正文

  本文主要讲解最大流问题的Ford-Fulkerson解法。可以说这是一种方法,而不是算法,因为它包含具有不同运行时间的几种实现。该方法依赖于三种重要思想:残留网络,增广路径和割。

  在介绍着三种概念之前,我们先简单介绍下Ford-Fulkerson方法的基本思想。首先需要了解的是Ford-Fulkerson是一种迭代的方法。开始时,对所有的u,v属于V,f(u,v)=0(这里f(u,v)代表u到v的边当前流量),即初始状态时流的值为0。在每次迭代中,可以通过寻找一个“增广路径”来增加流值。增广路径可以看做是从源点s到汇点t之间的一条路径,沿该路径可以压入更多的流,从而增加流的值。反复进行这一过程,直到增广路径都被找出为止,即得到最大的网络流。

举个例子来说明下,如图所示,每条线就代表了一条增广路径,当前s到t的流量为3。
在这里插入图片描述
当然这并不是该网络的最大流,根据寻找增广路径的算法我们其实还可以继续寻找增广路径,最终的最大流网络如下图所示,最大流为4。
在这里插入图片描述
接下来我们就介绍如何寻找增广路径。在介绍增广路径之前,我们首先需要介绍残留网络的概念。

流网络

先来看流网络的定义。对于流网络,《算法导论》第26章是这样定义的:

流网络 G = (V, E)是一个有向图,图中每一条边(u, v) ∈ E有一个非负的容量值c(u, v) >=0。而且,如果边集合E包含一条边(u, v),则图中不存在反方向的边(v, u)。如果(u, v) ∉ E,则为方便起见,定义c(u, v) = 0。并且在图中不允许自循环。在流网络的所有节点中,我们特别分辨出两个特殊节点:源节点s和汇点t。

  下面我来用一个例子对这个定义进行解释。来看下面的这个有向图。图中的s为源节点(source),t为汇点(sink)。 也就是说,对于顶点s,只能有以它为起点的边;而对于t,只能有以它为终点的边。 图中每个边上面的数字就是这条边的容量值c。例如,c(s, v) = 6。图中没有(s, z)这条边,因此c(s, z) = 0。图中不能有自循环边,也就是(s, s) 这样的边。我们用f(u, v)表示两个点之间的实际流量值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

残留网络

在这里插入图片描述

顾名思义,残留网络是指给定网络和一个流,其对应还可以容纳的流组成的网络。具体说来,就是假定一个网络G=(V,E),其源点s,汇点t。设f为G中的一个流,对应顶点u到顶点v的流。在不超过C(u,v)的条件下(C代表边容量),从u到v之间可以压入的额外网络流量,就是边(u,v)的残余容量(residual capacity),定义如下:

r(u,v)=c(u,v)-f(u,v)

举个例子,假设(u,v)当前流量为3/4,那么就是说c(u,v)=4,f(u,v)=3,那么r(u,v)=1。

我们知道,在网络流中还有这么一条规律。从u到v已经有了3个单位流量,那么从反方向上看,也就是从v到u就有了3个单位的残留网络,这时r(v,u)=3。可以这样理解,从u到v有3个单位流量,那么从v到u就有了将这3个单位流量的压回去的能力。

我们来具体看一个例子,如下图所示一个流网络
在这里插入图片描述
其对应的残留网络为:
在这里插入图片描述

增广路径

  在了解了残留网络后,我们来介绍增广路径。已知一个流网络G和流f,**增广路径p是其残留网络Gf中从s到t的一条简单路径。**形象的理解为从s到t存在一条不违反边容量的路径,向这条路径压入流量,可以增加整个网络的流值。上面的残留网络中,存在这样一条增广路径:
在这里插入图片描述
其可以压入4个单位的流量,压入后,我们得到一个新的流网络,其流量比原来的流网络要多4。这时我们继续在新的流网络上用同样的方法寻找增广路径,直到找不到为止。这时我们就得到了一个最大的网络流。

流网络的割

上面仅仅是介绍了方法,可是怎么证明当无法再寻找到增广路径时,就证明当前网络是最大流网络呢?这就需要用到最大流最小割定理。

首先介绍下,割的概念。流网络G(V,E)的割(S,T)将V划分为S和T=V-S两部分,使得s属于S,t属于T。割(S,T)的容量是指从集合S到集合T的所有边(有方向)的容量之和(不算反方向的,必须是S-àT)。如果f是一个流,则穿过割(S,T)的净流量被定义为f(S,T)(包括反向的,SàT的为正值,T—>S的负值)。将上面举的例子继续拿来,随便画一个割,如下图所示:
在这里插入图片描述

显然,我们有对任意一个割,穿过该割的净流量上界就是该割的容量,即不可能超过割的容量。所以网络的最大流必然无法超过网络的最小割。最小割是指割的容量最小,最大流是指网络当中最大的净流量,简单的例子s是水龙头源源不断往外排出水,这些边相当于管道,各管道的容量不容,在某一段的容量我们其实用割来表示,最小割就是在整体管道系统当中我们找到的最窄处也就是某一段管道流量最小处,而我们的水流流过某一阶段所有水流的总量用流量来表示,最大流就是我们通过该管道是某一阶段水的总量最多为多少,若超过了这个最大流量就会导致超过管道某一阶段的容量,就爆炸了,所以我们若想保证水流可以从s流到t,则必须保证水流流量也就是最大流要小于等于最小割,但是为了让水尽快流过去,所以我们要使最大流等于最小割,所以在求最优化的过程中,求最大流等效于求最小割,两者本质上是同一个问题。

可是,这跟残留网络上的增广路径有什么关系呢?

首先,我们必须了解一个特性,根据上一篇文章中讲到的最大流问题的线性规划表示时,提到,流网络的流量守恒的原则,根据这个原则我们可以知道,对网络的任意割,其净流量的都是相等的。具体证明是不难的,可以通过下图形象的理解下,
在这里插入图片描述
和上面的割相比,集合S中少了u和v,从源点s到集合T的净流量都流向了u和v,而在上一个割图中,集合S到集合T的流量是等于u和v到集合T的净流量的。其中w也有流流向了u和v,而这部分流无法流向源点s,因为没有路径,所以最后这部分流量加上s到u和v的流量,在u和v之间无论如何互相传递流,最终都要流向集合T,所以这个流量值是等于s流向u和v的值的。将s比喻成一个水龙头,u和v流向别处的水流,都是来自s的,其自身不可能创造水流。所以任意割的净流量都是相等的,割的净流量就是流量,求到最大时就是最大流且等于最小割,也就是流量守恒性质,各处流量相等

Ford-Fulkerson方法(用FORD-FULKERSON算法计算最大流、最小割)

下面来看Ford-Fulkerson算法。该算法同样使用了贪心策略。首先来看算法的伪代码。
在这里插入图片描述
伪代码理解如下:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

参考

https://www.freesion.com/article/67541250323/
https://www.cnblogs.com/DarrenChan/p/9563511.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FORD-FULKERSON算法 的相关文章

  • 正则表达式中(?:)、(?=)以及(?!)等的用法

    out 61 re findall r 39 d 43 61 abc 39 34 1abc 34 只抽取数字 xff0c 并且该数字后面跟的字符是 34 abc 34 print out out1 61 re findall r 39 d
  • Oracle 12C rman备份的坑,搞不好就会hang死

    RMAN Backup to Platform Temporarily Creates DMP File in ORACLE HOME dbs 文档 ID 2349921 1 This has been reported as BUG 25
  • Linux 上安装配置 VNC Server

    一 简介 VNC Virtual Network Console xff0c 即 虚拟网络控制台 它是一款优秀的远程控制工具软件 xff0c 而且是基于 UNIX 和 Linux 操作系统的免费开源的 1 优点 远程控制能力强大 xff0c
  • Xshell能ping通但连不上CentOS 7

    转 xff1a https blog csdn net trackle400 article details 52755571 在虚拟机 xff08 Vmware Workstation xff09 下 xff0c 安装了CentOS7 x
  • Pandas RuntimeWarning: More than 20 figures have been opened. Figures created plt.close()也不起作用

    以下是源代码 xff0c 结果 xff1a function里有个for循环 xff0c 在每一次循环都有plt close xff0c 但是还是报错 xff1a More than 20 figures have been opened
  • 为企业提供存储功能的Red Hat Stratis 2.0.1发布了

    导读Red Hat的Stratis存储项目用于在Linux上提供企业存储功能 xff0c 以与ZFS和Btrfs之类的产品竞争 xff0c 同时在LVM和XFS之上构建 xff0c 这是其2020年守护进程的首次更新 通过Stratis x
  • 【转载】Java基本类型的Writable封装

    Java基本类型的Writable封装 目前Java基本类型对应的Writable封装如表所示 所有这些Writable类都继承自WritableComparable 也就是说 xff0c 它们是可比较的 同时 xff0c 它们都有get
  • Ubuntu18.04 ROS Melodic的cv_bridge指向问题

    由于ROS Melodic自带的是Opencv3 2 0 xff0c 而我自己下载的是opencv3 4 5 xff0c 所以需要将cv bridge的指向改为我自己安装的opencv 全篇很长 xff0c 建议看完后操作 xff0c 不要
  • VNC服务器灰屏怎么办?

    VNC服务器出现灰屏如何解决 最直接的方法就是重启VNC xff0c 那么如何重启VNC呢 xff1f 远程连接VNC 首先关闭VNC xff0c 使用Putty软件 xff08 类似一个远程服务器控制软件 xff09 有关Putty软件可
  • Python str.isalpha

    str isalpha 功能描述 isalpha检查字符串是否只包含字母字符 语法 无参数 span class token builtin str span span class token punctuation span isalph
  • 华为手机MATE10所有分区备份与数据恢复方法

    华为手机MATE10所有分区备份与数据恢复方法 作者 xff1a 爱吃干锅牛肉的喵 时间2020 3 23 前言 xff1a 前段时间笔者手机的root权限出问题 xff0c 误操作重破解ROOT权限导致数据全部wipe并且系统也坏了 没办
  • 树莓派3B+安装系统(Raspbian)以及配置环境

    1 硬件准备 1 树莓派3B 43 xff08 E14 xff09 2 一张64G的闪迪存储卡 3 一个读卡器 4 普通电脑显示器 xff0c 键盘 xff0c 鼠标 5 一台可以正常工作的Window系统的电脑 2 安装系统 1 树莓派系
  • Ubuntu虚拟机无法上网的解决方法

    问题 在使用Ubuntu虚拟机时 xff0c 有时候会遇到无法上网的情况 解决办法一般有更改网络连接模式 xff08 桥接模式 NAT模式切换 xff09 重新设置虚拟机网卡等 但是 xff0c 最近遇到了以上办法均无法解决的情况 xff0
  • 用eclipse编写MapReduce程序的基本要点

    1 要想在eclipse上编写MapReduce xff0c 那么就需要在eclipse上安装hadoop插件 xff0c 具体操作是将hadoop安装目录下的contrib eclipse plugin hadoop 0 20 2 ecl
  • android 单双层桌面切换

    单双层桌面切换由于必须持久化数据 所以必须多创建单层桌面所须要的数据库表 一表为存储桌面图标 xff0c 表结构跟原生 桌面表一样 直接copy一份就可以了一表为存储桌面页 xff0c 表结构跟原生一样 创建上面两张表时注意下 数据库版本升
  • 对专业学习的期望与目标

    外界对计算机专业的评价多为晦涩 枯燥 难解 xff0c 一度 xff0c 让我这个初涉计算机领域的新手感到胆怯 彷徨 xff0c 而如今 xff0c 虽然我对计算机还是没有理解透 xff0c 还没有融入计算机的海洋 xff0c 却在一场极简
  • BGP路由

    内容概要 1 BGP的基本概念2 BGP的特点3 BGP的分类4 BGP的路由器5 BGP的工作原理6 BGP的状态机7 BGP对等体之间的交互原则8 建立对等体注意点9 命令 实验 1 BGP的基本概念 自治系统AS xff1a As是指
  • 【小5聊】VS2019开发工具之安装和部署winform项目

    VS2019版本 xff0c 已经移除了安装和部署功能 xff0c 需要到管理扩展下载 1 管理扩展下载安装和部署功能 installer Projects 记得需要关闭VS开发工具 xff0c 然后会自动安装 2 新建项目 搜索setup
  • C语言与C++的区别

    文章目录 前言语法加强部分一 struct关键字加强 xff1b 二 声明变量得到加强三 检测性加强1 申请寄存器变量并取地址问题2 重复定义变量问题3 函数传参问题 四 三目运算符的优化五 const常量的声明 主要有以下扩充引入了命名空

随机推荐