【算法设计与分析】网络流

目录

  • max-flow 和 min-cut
    • 流网络 Flow network
    • 最小割 Min-cut
    • 最大流 Max-flow
  • Greedy algorithm
  • Ford–Fulkerson algorithm
    • 剩余网络 Residual network
    • Ford–Fulkerson algorithm算法流程
  • 最大流最小割理论 max-flow min-cut theorem
  • 容量扩展算法 capacity-scaling algorithm
    • 时间复杂度分析 Analysis of Ford–Fulkerson algorithm
    • 优化:选择合适的增广路径
    • 选择足够大瓶颈容量的增广路径算法:Capacity-scaling algorithm
    • 寻找最短增广路径算法:BFS
  • 其他算法的时间复杂度

max-flow 和 min-cut

流网络 Flow network

流网络定义为一个元组 G = ( V , E , s , t , c ) G=(V, E, s, t, c) G=(V,E,s,t,c)

  • V:流网络中点的集合
  • s:源点,没有流量输入,只有流量输出 s ∈ V s ∈ V sV
  • t:汇点,没有流量输出,只有流量输入 t ∈ V t ∈ V tV
  • E:流网络中边的集合
  • c ( e i ) c(e_i) c(ei):边的容量, c ( e i ) > = 0 c(e_i) >= 0 c(ei)>=0
    在这里插入图片描述

最小割 Min-cut

割 (s-t cut) 被定义为一个点的划分 ( A , B ) (A, B) (A,B),其中 s ∈ A s ∈ A sA t ∈ B t ∈ B tB。即将流网络的所有点,分成两个部分 A 和 B。
割的容量(capacity):定义为 从 A 到 B 线段的容量之和: c a p ( A , B ) = ∑ e o u t o f A c ( e ) cap(A, B) = \sum_{ e\ out\ of\ A} c(e) cap(A,B)=e out of Ac(e)

如下图所示,A 仅包含 s,因此 c a p ( A , B ) = 10 + 5 + 15 = 30 cap(A, B) = 10 + 5 + 15 = 30 cap(A,B)=10+5+15=30
在这里插入图片描述
下图割的容量: c a p ( A , B ) = 10 + 8 + 16 = 34 cap(A, B) = 10 + 8 + 16 = 34 cap(A,B)=10+8+16=34
在这里插入图片描述

最小割(Min-cut):即整个流网络中,容量最小的那个割(st cut).

最大流 Max-flow

定义 流 st-flow (flow) f f f 是一个满足以下条件的函数:

  • 每一个 e ∈ E e ∈ E eE,均有 0 < = f ( e ) < = c ( e ) 0 <= f(e) <= c(e) 0<=f(e)<=c(e) ,即流量小于等于容量。
  • 对于任意 v ∈ V − s , v v ∈ V - {s , v} vVs,v,即出去源点和汇点的其他点: ∑ e i n t o v f ( e ) = ∑ e i o u t o f v f ( e ) \sum_{e\ in\ to\ v}f(e) = \sum_{e\ iout\ of\ v}f(e) e in to vf(e)=e iout of vf(e),即出去源点和汇点,所有进入点的流量等于流出点的容量。

进入v的流量: 5 + 5 + 0 = 13 5 + 5 + 0 =13 5+5+0=13、流出v的流量: 10 + 0 = 10 10 + 0 = 10 10+0=10
在这里插入图片描述

流 flow 的值定义为: v a l ( f ) = ∑ e o u t o f s f ( e ) − ∑ e i n t o s f ( e ) val(f) = \sum_{e\ out\ of\ s}f(e) - \sum_{e\ in\ to\ s}f(e) val(f)=e out of sf(e)e in to sf(e)

下图中,网络流的值为: 10 + 5 + 10 = 25 10 + 5 + 10 = 25 10+5+10=25
在这里插入图片描述
最大流Max-flow:流网络中,值最大的流即为最大流。

最大流问题最小割问题 问题是等价的。

Greedy algorithm

增广路径 Augmenrt Path:从 源点 s 到 汇点 t 的一条简单路径,路径上任意一条边均满足 f ( e ) < c ( e ) f(e) < c(e) f(e)<c(e)
阻塞流 Blocking Flow:如果一个 流 flow,找不到增广路径,则该流称为阻塞流。最大流一定是阻塞流,但阻塞流不一定是最大流

贪心算法的流程:

  • 初始流上,任意的 e ∈ E , f ( e ) = 0 e ∈ E, f(e) = 0 eE,f(e)=0
  • 进行流量的增加:
    • 寻找该流上的增广路径 P
    • 增加 增广路径 P 上各个边的流量
  • 重复流量增加的步骤,直至该流变成阻塞流

贪心算法得到的阻塞流并不一定是最大流,因为贪心在寻找增广路径之后,直接沿着找到的增广路径进行流量的增加,之后就继续找下一条增广路径。没有考虑增广路径找错的情况,没有办法减少增广路径上的错误流量。

Ford–Fulkerson algorithm

剩余网络 Residual network

原始边 Original edge e = ( u , v ) ∈ E e = (u, v) ∈ E e=(u,v)E,且边上的流量: f ( e ) f(e) f(e)、边上的容量: c ( e ) c(e) c(e)
在这里插入图片描述

反向边 e r e v e r s e = ( v , u ) e^{reverse} = (v, u) ereverse=(v,u)
剩余容量 c f ( e ) = { c ( e ) − f ( e ) e ∈ E f ( e r e v e r s e ) e r e v e r s e ∈ E c_f(e)=\begin{cases} c(e)-f(e) &e∈E \\ f(e^{reverse})&e^{reverse}∈E \end{cases} cf(e)={c(e)f(e)f(ereverse)eEereverseE
在这里插入图片描述

剩余网络 Residual network G = ( V , E f , s , t , c f ) G = (V, E_f, s, t, c_f) G=(V,Ef,s,t,cf)

  • E f = { e : f ( e ) < c ( e ) } ∪ { e : f ( e r e v e r s e ) > 0 } E_f = \{e: f(e) < c(e)\} ∪ \{e: f(e^{reverse}) > 0\} Ef={e:f(e)<c(e)}{e:f(ereverse)>0}

定义增广路径瓶颈容量 为 增广路径上,最小的剩余容量。

Ford–Fulkerson algorithm算法流程

  • 初始流上,任意的 e ∈ E , f ( e ) = 0 e ∈ E, f(e) = 0 eE,f(e)=0
  • 进行剩余图上流量的增加:
    • 寻找该剩余图上的增广路径 P
    • 增加 增广路径 P 上各个边的流量,同时在剩余图上添加反向变
  • 重复流量增加的步骤,直至该流变成阻塞流

算法的流量增减都是在剩余图上进行操作的。

最大流最小割理论 max-flow min-cut theorem

定义 f f f 为任意的 流 flow ( A , B ) (A, B) (A,B) 为任意的 割 cut,则 f f f的流量大小等于流过 ( A , B ) (A,B) (A,B)的流量。
v a l ( f ) = ∑ e o u t o f A f ( e ) − ∑ e i n t o A f ( e ) val(f) = \sum_{e \ out \ of A}f(e) - \sum_{e \ in \ to\ A}f(e) val(f)=e out ofAf(e)e in to Af(e)

在这里插入图片描述
在这里插入图片描述
v a l ( f ) = ∑ e o u t o f A f ( e ) − ∑ e i n t o A f ( e ) v a l ( f ) = ∑ e o u t o f s f ( e ) − ∑ e i n t o s f ( e ) = ∑ v ∈ A ( ∑ e o u t o f A f ( e ) − ∑ e i n t o A f ( e ) ) = ∑ e o u t o f A f ( e ) − ∑ e i n t o A f ( e ) val(f) = \sum_{e \ out \ of A}f(e) - \sum_{e \ in \ to\ A}f(e)\\ val(f) = \sum_{e \ out \ of s}f(e) - \sum_{e \ in \ to\ s}f(e)\\ = \sum_{v ∈ A}( \sum_{e \ out \ of A}f(e) - \sum_{e \ in \ to\ A}f(e))\\ = \sum_{e \ out \ of A}f(e) - \sum_{e \ in \ to\ A}f(e) val(f)=e out ofAf(e)e in to Af(e)val(f)=e out ofsf(e)e in to sf(e)=vA(e out ofAf(e)e in to Af(e))=e out ofAf(e)e in to Af(e)

同时定义 f f f 为任意的 流 flow ( A , B ) (A, B) (A,B) 为任意的 割 cut,则 v a l ( f ) < = c a p ( A , B ) val(f) <= cap(A, B) val(f)<=cap(A,B)
v a l ( f ) = ∑ e o u t o f A f ( e ) − ∑ e i n t o A f ( e ) < = ∑ e o u t o f A f ( e ) < = ∑ e o u t o f A c ( e ) = c a p ( A , B ) val(f) = \sum_{e \ out \ of A}f(e) - \sum_{e \ in \ to\ A}f(e)<= \sum_{e \ out \ of A}f(e) <= \sum_{e \ out \ of A}c(e) = cap(A, B) val(f)=e out ofAf(e)e in to Af(e)<=e out ofAf(e)<=e out ofAc(e)=cap(A,B)

定义 f f f 为任意的 流 flow ( A , B ) (A, B) (A,B) 为任意的 割 cut。如果 v a l ( f ) = c a p ( A , B ) val(f) = cap(A, B) val(f)=cap(A,B),那 f f f 一定是最大流, ( A , B ) (A, B) (A,B)一定是最小割。

Max-flow min-cut theorem:Value of a max flow = capacity of a min cut.

容量扩展算法 capacity-scaling algorithm

时间复杂度分析 Analysis of Ford–Fulkerson algorithm

假设 流网络 中所有的边上的容量均为整数,且 范围是 1~C。
则 FFA算法中,每一条边的流量和剩余容量也都是正整数。

假设 f ∗ f* f 是某流网络的最大流,则该流网络中最大流流量 v a l ( f ∗ ) < = n C val(f*) <= nC val(f)<=nC

又每次增广路径最少也会增加 1 的流量,假设使用 BFS、DFS来寻找增广路径,时间复杂度为 O ( m ) O(m) O(m),则Ford–Fulkerson algorithm 的时间复杂度最坏为: T ( n ) = O ( m n C ) T(n) = O(mnC) T(n)=O(mnC)

T ( n ) = O ( m n C ) T(n) = O(mnC) T(n)=O(mnC)的情况出现在,每一次找到的增广路径都只能增加一个容量,例如:
在这里插入图片描述

如果时间复杂度为 O ( m n C ) O(mnC) O(mnC),那么该时间复杂度并非多项式时间的,需要根据边的数量以及容量的大小来判断是否能在一定时间内解决。

优化:选择合适的增广路径

出现上述非多项式时间的时间复杂度的情况的原因:每一次增广路径都只增加1个流量,即瓶颈容量为1的增广路径。
因此我们可以选择更合适的增广路径。

  • 最大瓶颈容量的增广路径
  • 足够大的瓶颈容量的增广路径
  • 最短路径的增广路径

选择足够大瓶颈容量的增广路径算法:Capacity-scaling algorithm

算法大致流程:

  • 首先遍历所有的边,得到最大容量/2,将其设置为当前瓶颈容量下限 k
  • 在剩余图中寻找瓶颈容量大于等于 k 的增广路径
    • 如果找到了就执行FFA算法
    • 如果找不到了,就将 k 减小到原来的一半
  • 一直执行寻找增广路径的循环,直至 k 变为1,此时所有的增广路径都能正常寻找到。

算法伪代码
在这里插入图片描述
m:边的数量
n:点的数量
C:容量的上限
使用该算法寻找增广路径,总的寻找最大流的时间复杂度: T ( n ) = O ( m 2 l o g C ) T(n) = O(m^2logC) T(n)=O(m2logC)

寻找最短增广路径算法:BFS

使用队列,不断扩展下一个节点,当到达 t ,此路径即为最短路。

算法伪代码
在这里插入图片描述

m:边的数量
n:点的数量
C:容量的上限
使用该算法寻找增广路径,总的寻找最大流的时间复杂度: T ( n ) = O ( m 2 n ) T(n) = O(m^2n) T(n)=O(m2n)

其他算法的时间复杂度

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/234104.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang : Bson\Json互转

代码 package bson_jsonimport ("encoding/json""errors""fmt""gopkg.in/mgo.v2/bson""os""testing" )type User struct {Name string json:"name,omitempty" bson:"name,omitempty"CSD…

大创项目推荐 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

三甲医院ADR智能监测系统源码,药品不良反应智能监测系统全套源码,java语言,自主研发

ADR智能监测系统源码&#xff0c;药品不良反应智能监测系统全套商业项目源码&#xff0c;自主版权 ADR监测上报系统是基于医院临床数据中心而建立&#xff0c;运用信息技术实现药品不良反应的智能监测、报告管理、知识库查询、统计分析等功能。 系统自动提取不良反应报告数据&…

(二)Explain使用与详解

explain中的列 sql语句: EXPLAIN SELECT * from user WHERE userId=1340; 执行结果: 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。 id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行…

如何在 Ubuntu 20.04 上安装和使用 Docker

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装和使用 Docker 介绍 Docker是一个可以简化容器中应用程序进程管理过程的应用程序。…

数据湖存储解决方案之Iceberg

1.Iceberg是什么&#xff1f; Apache Iceberg 是由 Netflix 开发开源的&#xff0c;其于2018年11月16日进入 Apache 孵化器&#xff0c;是 Netflix 公司数据仓库基础。Apache Iceberg设计初衷是为了解决Hive离线数仓计算慢的问题&#xff0c;经过多年迭代已经发展成为构建数据…

Qt实现简单的分割窗口

最近在学习一些关于Qt的新知识&#xff0c;今天来讲述下我学习到的窗口分割&#xff0c;如果有不正确的&#xff0c;大家可以指正哦~ 首先&#xff0c;先看一下实现之后的简单效果吧&#xff01;省的说的天花乱坠&#xff0c;大家却不知道说的是哪个部分。 功能实现 整体demo…

Spring事务控制

1.事务介绍 1.1什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句全部不进行执…

C#VS2022 打包成安装包

步骤参考&#xff1a;VisualStudio&#xff08;2022&#xff09;- 打包项目文件为.exe安装包_vs2022打包exe-CSDNja 步骤参考上方链接&#xff0c;不过在Application Folder文件夹中加的是\项目名称\bin\Debug\下的全部文件&#xff0c;其他地方一样。 最终生成的安装包在Deb…

书生·浦语大模型实战2

轻松玩转书生浦语大模型趣味 Demo 大模型及 InternLM 模型简介 什么是大模型 大模型通常指的是机器学习或人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型。这些模型利用大量数据进行训练&#xff0c;并且拥有数十亿甚至数千亿个参数。大模型的出现和发展得益…

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容&#xff0c;tree是多维数组&#xff0c;一级一级的对比输入的内容是否匹配&#xff0c;用forEach循环遍历数据&#xff0c;匹配不到在往下找&#xff0c;直到找到为null &#x…

浅谈安科瑞直流表在孟加拉某能源公司的应用

摘要&#xff1a;本文介绍了安科瑞直流电表在孟加拉某能源公司的应用。主要用于光伏直流柜内&#xff0c;配合分流器对汇流箱的输出电流电压等进行测量&#xff0c;并采集配电现场的开关信号&#xff0c;装置带有RS485接口可以把测量和采集的数据和设备状态上传。 Abstract: T…

sql:定时执行存储过程(嵌套存储过程、使用游标)

BEGINDeclare FormNo nvarchar(20) --单号Declare Type nvarchar(50) --类型Declare PickedQty float -Declare OutQty float Declare 生产量 floatDeclare 已装箱数量 float Declare 已入库数量 floatDeclare 损耗数量 float Declare 退货品出库数量 intdeclare k c…

文件夹重命名方法:文件夹名称随机数字命名,提高文件管理效率的秘诀

在数字时代&#xff0c;每天都会创建、接收和存储大量的文件。那如何有效地管理和查找这些文件&#xff1f;下面云炫文件管理器用简单的方法使用随机数字给文件夹命名。掌握方法可以快速识别和分类文件&#xff0c;提高工作效率。 文件夹随机数字命名前后效果图。 文件夹名称…

【Java EE初阶八】多线程案例(计时器模型)

1. java标准库的计时器 1.1 关于计时器 计时器类似闹钟&#xff0c;有定时的功能&#xff0c;其主要是到时间就会执行某一操作&#xff0c;即可以指定时间&#xff0c;去执行某一逻辑&#xff08;某一代码&#xff09;。 1.2 计时器的简单介绍 在java标准库中&#xff0c;提供…

阿里云服务器Centos安装宝塔面板

阿里云服务器Centos安装宝塔面板 1 背景1.1 aliyun1.2 Linux 2 安装步骤2.0 环境配置2.1 安装前准备2.2 宝塔安装2.3 建站 3 centos常用命令3.1 防火墙相关 1 背景 1.1 aliyun 阿里云服务器是阿里云提供的一项云计算服务&#xff0c;它能够帮助用户快速搭建网站、应用和服务&…

苍穹外卖Day01——总结1

总结1 1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 技术选项 3. Swagger4. 补充内容&#xff08;待解决...&#xff09; 1. 软件开发整体介绍 1.1 软件开发流程 1.2 角色分工 从角色分工里面就可以查看自己以后从事哪一…

寄10公斤包裹哪个快递便宜(寄快递哪个比较便宜)

如今&#xff0c;随着互联网的发展&#xff0c;越来越多的人选择网上购物&#xff0c;这支撑了许多物流公司不断地向前发展。所以快递行业的前景还是很光明的。现在当天寄出最晚第二天就能收到。但是快递公司那么多&#xff0c;每个公司的特色和收费都有差异。怎样才能选择合适…

windows通过ssh连接Liunx服务器并实现上传下载文件

连接ssh 输入&#xff1a;ssh空格用户名ip地址&#xff0c;然后按Enter 有可能出现下图提示&#xff0c;输入yes 回车即可 输入 password &#xff0c;注意密码是不显示的&#xff0c;输入完&#xff0c;再按回车就行了 以上是端口默认22情况下ssh连接&#xff0c;有些公司它…

微信小程序 获取地址信息(uniapp)

参考API地址&#xff1a;微信小程序JavaScript SDK | 腾讯位置服务 <script> // 引入SDK核心类&#xff0c;js文件根据自己业务&#xff0c;位置可自行放置var QQMapWX require(../../js/uploadImg/qqmap-wx-jssdk.js);export default {data(){return{qqmapsdk:}},onL…