最大流算法 - 标号法

2023-11-10

标号法求最大流

图论中网络的相关概念见上篇博客

算法基本思想:
从某个初始流开始,重复地增加流的值到不能再改进为止,则最后所得的流将是一个最大流。为此,不妨将每条边上的流量设置为0作为初始流量。为了增加给定流量的值,我们必须找出从发点到收点的一条路并沿这条路增加流量。

当前流为最大流的充要条件:网络中不存在增广路
最大流最小截定理:在任何网络中,最大流的流量等于最小截集的容量。
整数流定理:在任何网络中,如果网络所有的弧容量都是整数,则存在整数最大流。

明确一点:最大流是指网络中流的值达到最大,即源的出流量或汇的入流量达到最大,每段弧都有对应的流量,而不是求网络中某个路径的流量。

把最大流算法想象成两个运输站之间运货,两个运输站之间有很多个中转站,每个中转站都有一个最大容量,站与站之间运货都有不同的运货量,而且中转站不会留货物,所以货物的总量一定等于源站的出货数或者汇站的进货数。最大流算法就是在不超过所有中转站的容量的情况下,求最大出货量/进货量以及所有中转站之间的运货量。
如下图所示,左边是容量,右边是流量,在如图所示的流中,流的值达到了最大,为13,也不存在增广路,所谓增广路就是一条从源到汇的路径,路径上的所有弧非饱和(正向)或非空(反向),即一条仍能增加流量的路。
在这里插入图片描述
为什么说增广路是一条仍能增加流量的路?其实不难理解,增广路的定义如上文,路径上的所有弧非饱和(正向)或非空(反向),反向弧的流量假设为n,实际上等价于为正向弧的流量为-n,因为n不能小于0,所以n=0的时候,反向弧的流量虽然达到了最小,但是把他当做正向弧的时候,流量却达到了最大。
对于一条路径而言,非饱和弧和非空弧都意味着该条路径的流量没有达到饱和。既然网络中存在一条没有达到饱和的路径,那么网络的流也没有达到最大。这就是当前流为最大流的充要条件,可用数学语言证明。

算法文字描述:
步骤0:将网络中所有弧流量全部置0
步骤1:将源的点流量设为无穷大,令u=s。
步骤2:标记 点 v i = u v_i=u vi=u的所有未被标记的邻点 v j v_j vj的点流量(BFS)。
标记方法:若u到邻点是正向弧,且流量小于容量,则点流量 Δ ( v j ) Δ(v_j) Δ(vj)取前点流量 Δ ( v i ) Δ(v_i) Δ(vi)和弧的容流量差值 C i j − F i j C_{ij}-F_{ij} CijFij的较小者
若是反向弧连接,且流量大于0,则点流量 Δ ( v j ) Δ(v_j) Δ(vj)取前点流量 Δ ( v i ) Δ(v_i) Δ(vi)和弧流量 F i j F_{ij} Fij的较小者
步骤3:若标记到了汇则转步骤4,否则任选一个刚刚被标记的点设为 u u u,转步骤2,若刚刚没有标记任何点则算法结束。(步骤2由于会执行多次,刚刚表示步骤2最近一次执行时标记的点, v i v_i vi的可被标记的邻点
步骤4:从汇开始,依次回溯被标记的点,并将两点之间的弧加/减一个汇流量 Δ ( t ) Δ(t) Δ(t),正向则加,反向则减,回溯到源后,转步骤1。

算法符号描述:
步骤0: 设F是从源s到汇t的任意可行流,对任意 < μ , v > = < v i , v j > ∈ E <μ,v>=<v_i,v_j>∈E <μ,v>=<vi,vj>E,令 F i j = 0 F_{ij}=0 Fij=0。//从零流开始。
步骤1: 对源 s = v 0 s=v_0 s=v0标记为 ( s , + , Δ ( s ) = ∞ ) , S = { s } , U = { v j } , j = 0 , 1 , 2 , ⋯ , n ; μ = v i = s 。 (s,+,Δ(s)=∞),S={s},U={v_j},j=0,1,2,⋯,n;μ=v_i=s。 (s,+,Δ(s)=)S=sU=vj,j=0,1,2,,nμ=vi=s(S表示已标记的顶点集,U未检查的顶点集,初始值为全体顶点。)
步骤2: S ¯ S¯ S¯(S的补)中与 μ = v i μ=v_i μ=vi的所有邻点 v j v_j vj,有:
(1) 若 < v i , v j > ∈ E , 且 F i j < C i j <v_i,v_j>∈E,且F_{ij}<C_{ij} <vi,vj>EFij<Cij,则将 v j v_j vj标记为 ( v i , + , Δ ( v j ) ) (v_i,+,Δ(v_j)) (vi,+,Δ(vj)),其中 Δ ( v j ) = m i n ⁡ { Δ ( v i ) , C i j − F i j } , S = S ∪ v j Δ(v_j)=min⁡{Δ(v_i),C_{ij}-F_{ij}},S=S∪{v_j} Δ(vj)=minΔ(vi),CijFijS=Svj
(2) 若 < v j , v i > ∈ E <v_j,v_i>∈E <vj,vi>E,且 F i j > 0 F_{ij}>0 Fij>0,则将 v j v_j vj标记为 ( v i , − , Δ ( v j ) ) (v_i,-,Δ(v_j)) (vi,,Δ(vj)),其中 Δ ( v j ) = m i n ⁡ { Δ ( v i ) , F i j } , S = S ∪ v j Δ(v_j)=min⁡{Δ(v_i),F_{ij}},S=S∪{v_j} Δ(vj)=minΔ(vi),FijS=Svj
步骤3: v j = t ∈ S v_j=t∈S vj=tS,转步骤4,否则 v j ≠ t v_j≠t vj=t,令 U = U − v i U=U-{v_i} U=Uvi,若 S ∩ U = φ S∩U=φ SU=φ,则算法结束,当前流为最大流;否则若 S ∩ U ≠ φ S∩U≠φ SU=φ,任选 v i ∈ S ∩ U v_i∈S∩U viSU,转步骤2。(实际上,S∩U就是步骤2中刚刚被标记的点)
步骤4: z = t z=t z=t
步骤5: z z z的标记为 ( g , + , Δ ( z ) ) (g,+,Δ(z)) (g,+,Δ(z)),则 F ( < g , z > ) = F ( < g , z > ) + Δ ( z ) F(<g,z>)=F(<g,z>)+Δ(z) F(<g,z>)=F(<g,z>)+Δ(z)
若z的标记为 ( g , − , Δ ( z ) ) (g,-,Δ(z)) (g,,Δ(z)),则 F ( < z , g > ) = F ( < z , g > ) − Δ ( z ) F(<z,g>)=F(<z,g>)-Δ(z) F(<z,g>)=F(<z,g>)Δ(z)
步骤6: g = s g=s g=s,则取消所有点的标号,转步骤1,否则,令 z = g z=g z=g,转步骤5。
标记的意义: ( v i , + , Δ ( v j ) ) (v_i,+,Δ(v_j )) (vi,+,Δ(vj))表示点 v i v_i vi经流量为 Δ ( v j ) Δ(v_j) Δ(vj)的正向弧到达点 v j v_j vj
( v i , − , Δ ( v j ) ) (v_i,-,Δ(v_j )) (vi,,Δ(vj))表示点 v i v_i vi经流量为 Δ ( v j ) Δ(v_j) Δ(vj)的反向弧到达点 v j v_j vj

符号描述可能不好理解,对照文字描述理解。

例子:(编辑太麻烦了,从word截的图)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
欢迎讨论

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

最大流算法 - 标号法 的相关文章

  • js逆向-无限debugger的原理及绕过

    前言 转载自 爬虫从入门到精通 12 js调试中的一些问题 无限debugger 调试干扰 内存爆破 转载自 js 无限debugger 的原理 以及解决办法 文章目录 前言 一级目录 二级目录 三级目录 一 调试检测 1 无法打开f12

随机推荐

  • 拖拽更新层级分类、更新层级id树:

    program mycs java description 拖拽编辑试题分类标签参数数据类 author wupeiguo create 2020 03 17 11 30 Data Accessors chain true ApiModel
  • CCS软件的Graph功能

    如何正确使用CCS自带绘图Graph功能 Single Time使用演示 点击菜单栏Tools gt Graph gt Single Time 如图所示 点开后出现如下的对话窗口 下面对里面的每一项参数进行一下说明 Acquisition
  • linux系统PC机安装(非虚拟机,以centos为例)

    centos介绍 CentOS CommunityEnterprise Operating System 中文意思是 社区企业操作系统 我们有很多人叫它 社区企业操作系统 不管你怎么叫它 它都是linux的一个发行版本 CentOS并不是全
  • C语言指针知识点(一):字符指针(char *)及其格式输出(%c%d%s等)

    类型是分配内存块大小的别名 即类型 int double char 的作用就是分配相对应大小的内存 并给程序员一个名字 int double char 方便操作 指针也是一种数据类型 定义时可以对其赋值 可赋任意地址值 但习惯赋值为NULL
  • Windows10下VTR.7中VPR项目的运行

    下载VTR7和Visual Studio2022 点击sln文件 打开vpr工程 项目升级 vpr为VS2010的项目 需要先对工程文件升级后再编译 取消较小类型检查 上方菜单 项目 VPR属性 C C 代码生成 编译链接 运行 命令行运行
  • Elasticsearch Java 操作之后查询数据未及时更新

    在请求里加这个参数 request setRefreshPolicy WriteRequest RefreshPolicy IMMEDIATE 例如 public boolean saveOrUpdate String indexName
  • ListView具有多种item布局——实现微信对话列 .

    这篇文章的效果也是大家常见的 各种通讯应用的对话列表都是这种方式 像微信 whatsapp 易信 米聊等 我们这篇文章也权当为回忆 形成简单的笔记 这篇文章参考了2009年Google IO中的 TurboChargeYourUI How
  • linux启动,挂栽,共享,忘记密码的解决方法

    Linux修改linux的启动方式 修改linux启动方式 文本方式或xwindow方式 vi etc inittab 找到id x initdefault 一行 x 3为文本方式 x 5为xwindow方式 重启机器即可生效 mount用
  • Leetcode5438. 制作 m 束花所需的最少天数——另类的二分法

    文章目录 引入 二分法题解 制作 m 束花所需的最少天数 二分法题解 分割数组的最大值 二分法题解 两球之间的磁力 引入 之前在周赛遇到5438 制作 m 束花所需的最少天数 给你一个整数数组 bloomDay 以及两个整数 m 和 k 现
  • YOLOV5改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

    在YoloV5中添加EIoU SIoU AlphaIoU FocalEIoU Wise IoU 2023 2 7 更新 yolov5添加Wise IoUB站链接 重磅 YOLO模型改进集合指南 CSDN yolov5中box iou其默认用
  • java 16进制与图片互转

    十六进制转成图片 十六进制转成图片 author Administrator public static void saveToImgFile String src String output if src null src length
  • 使用JMS进行消息传递

    你需要什么 大约 15 分钟 IntelliJ IDEA或其他编辑器 JDK 1 8或更高版本 Maven 3 2 你会建立什么 本指南将指导您完成使用 JMS 代理发布和订阅消息的过程 您将构建一个应用程序 该应用程序使用Spring的
  • 关于项目属性书写应该严重注意的问题

    这样马马虎虎不注意属性的书写细节 会导致属性查询或者注入失败 public class Goods private Integer goodsId private String goodsName private String goodsT
  • C#学习笔记 常用的集合

    列表List lt T gt 列表List lt T gt 实现了IList ICollection IEnumberable IList接口 可以向该列表中动态的添加 删除 查找元素 如果列表中的元素满了 会动态分配一个容量是原来两倍的列
  • Docker 的基本概念和优势

    Docker是一个开源的容器化平台 可以将应用程序和所有依赖项打包在一起 形成一个独立的 可移植的容器 以下是Docker的基本概念和优势 基本概念 Docker镜像 Docker镜像是一个包含应用程序和所有依赖项的文件系统 它可以用来创建
  • 服务器系统如何账务处理,云服务器费用账务处理

    云服务器费用账务处理 内容精选 换一换 用户支付订单后 如果收到云服务器开通失败的短信 请致电华为云客服中心电话4000 955 988 客服会协助用户排除故障 开通云服务器 如果故障无法及时排除 用户可以选择取消订单 客服会做退费处理 将
  • Maven项目,本地jar包导入手动导入到Maven库中

    当你的项目 由于网络或者环境这些问题 无法从maven中央仓库更新jar包到本地的时候 可以尝试下面方法 手动添加jar包到Maven仓库 方法一 推荐 1 需要先拿到你的jar包 copy到本地 例如我的就是hutool all 5 8
  • sql注入详细过程

    前提 mysql5 0以上版本包含内置的information schema数据库 它储存着mysql所有的数据库和表结构信息 利用该数据库可以查询到所有的数据库和表的内容 一 5 0 暴力破解的方式获取数据 1 原理 当我们的Web ap
  • 运维工程师绩效考核表_运维人员初步 度绩效考核表

    姓 名 部 门 岗 位 上级领导 时 间 考核分类 考核维 度 权重 指标 数据来源 考核评分 复核 10 计划合理 偏差范围可控 10 分 考评 30 按计划完成的时间 30分 考评 10 机房设备的是否正常运行 10 考评 10 网站的
  • 最大流算法 - 标号法

    标号法求最大流 图论中网络的相关概念见上篇博客 算法基本思想 从某个初始流开始 重复地增加流的值到不能再改进为止 则最后所得的流将是一个最大流 为此 不妨将每条边上的流量设置为0作为初始流量 为了增加给定流量的值 我们必须找出从发点到收点的