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

目录

  • 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.mzph.cn/news/606495.shtml

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

相关文章

【读书笔记】《我的天才女友》

这套书一共有四本&#xff0c;这个是第一本&#xff0c;作者意大利人埃莱娜费兰特&#xff0c;这个只是她的笔名&#xff0c;至今还不知道这位作者是谁&#xff0c;她以每年一本书的速度出了“那不勒斯四部曲”&#xff0c;这四本书以两个女主人公莉拉和莱农的友情为主线。 莉拉…

ElasticSearch 集群搭建与状态监控cerebro

单机的elasticsearch做数据存储&#xff0c;必然面临两个问题:海量数据存储问题、单点故障问题。为了解决存储能力上上限问题就可以用到集群部署。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&#xff0c;存储到多个节点单点故障问题:将分片数据在不同节点备份 (r…

力扣题:高精度运算-1.3

力扣题-1.3 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;43. 字符串相乘 解题思想&#xff1a;类似计算时采用的竖式乘法。首先取得num2的低位&#xff0c;并补齐对应的0&#xff0c;然后与num1进行相乘&#xff0c;然后进行字符串的相加操作。…

腾讯云com域名注册1元条件说明

腾讯云com域名注册优惠价格1元首年&#xff0c;条件是企业新用户&#xff0c;个人新用户注册com域名是33元首年&#xff0c;第二年续费价格85元一年。活动 txybk.com/go/domain-sales 活动打开如下图&#xff1a; 腾讯云com域名注册优惠价格 腾讯云com域名注册原价是85元一年&a…

数据结构—图(下)

文章目录 12.图(下)(4).生成树和最小生成树#1.什么是生成树和最小生成树&#xff1f;i.生成树ii.最小生成树 #2.Prim算法i.算法思想ii.看看例子iii.代码实现 #3.Kruskal算法i.算法思想ii.看看例子iii.代码实现 #4.次小生成树 (5).最短路径问题#1.加权有向图的最短路径问题#2.单…

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800&#xff0c;因为我们要添加的图片大…

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具&#xff0c;用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体&#xff0c;能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

用RASP五步轻松保护云端无服务器架构

近年来无服务器架构发展势头正猛&#xff0c;预计未来十年将增长近25%。据称&#xff0c;2022年无服务器架构市场的规模超过了90亿美元&#xff0c;年复合增长率预计将增加。到2032年&#xff0c;市场规模可能超过900亿美元。 这表明&#xff0c;在组织日益采用DevOps的影响下&…

Nvidia Jetson AGX Orin使用CAN与底盘通信(ROS C++ 驱动)

文章目录 一、Nvidia Jetson AGX Orin使用CAN通信1.1 CAN使能配置修改GPIO口功能1.2 can收发测试 二、通过CAN协议编写CAN的SocketCan ROS1驱动程序2.1 通讯协议2.2 接收数据节点2.3 发送数据节点2.4 功能包配置 三、ROS2驱动程序 一、Nvidia Jetson AGX Orin使用CAN通信 参考…

OCS2 入门教程(四)- 机器人示例

系列文章目录 前言 OCS2 包含多个机器人示例。我们在此简要讨论每个示例的主要特点。 System State Dim. Input Dim. Constrained Caching Double Integrator 2 1 No No Cartpole 4 1 Yes No Ballbot 10 3 No No Quadrotor 12 4 No No Mobile Manipul…

逻辑回归(Logistic Regression)

什么是机器学习 逻辑回归&#xff08;Logistic Regression&#xff09;虽然名字中包含"回归"一词&#xff0c;但实际上是一种用于解决分类问题的统计学习方法&#xff0c;而不是回归问题。它是一种线性模型&#xff0c;常用于二分类问题&#xff0c;也可以扩展到多分…

【亲测】申请腾讯云免费服务器流程,2024新版教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

vue3 修饰符大全(近万字长文)

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、事件修饰符&#xff08;Event Modifiers&#xff09;1、.stop&#xff08;阻止事件冒泡&#xff09;2、.prevent&#xff08;阻止事件的默认行为&#xff09;3、.capture&#xff08;使用事件捕获模式…

如何优雅的搭建一个轻量化的网站

本地网页 这里我找到了一个带有简单的悬停变色效果的个人博客网站模板。用来演示这次的轻量化网站搭建。你可以复制这段代码到一个txt文件中&#xff0c;修改文件后缀名为html即可得到一个最简单的静态网页文件。在没有搭建网站服务器时&#xff0c;本机可以通过直接双击该文件…

YOLOv5改进之---EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

本文主要针对yolov5的iou损失函数进行改进,主要涵盖EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU这几种损失。 一、首先会对这几种损失进行介绍: 1、背景 由于EIOU是在CIOU的基础上改进的,为方便理解,此处贴出CIOU的计算公式,其他GIOU、DIOU不作介绍。 CIOU公式如下所示: b ,…

C++ 中的指针和引用有什么区别?

C 中的指针和引用有什么区别&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#…

alibabacloud学习笔记02(小滴课堂)

什么是注册中心和常见的注册中心有哪些 介绍什么是Nacos和搭建实战 启动Nacos 使用前要先安装jdk。 linux学习专栏笔记中有&#xff0c;大家可以去看。 关闭nacos: 这样我们就登录了nacos。 项目集成Nacos实现服务直接的调用 每个子模块都去添加。 给每个子模块配置nacos配…

C++力扣题目--94,144,145二叉树非递归(迭代)遍历

为什么可以用迭代法&#xff08;非递归的方式&#xff09;来实现二叉树的前后中序遍历呢&#xff1f; 我们在栈与队列&#xff1a;匹配问题都是栈的强项 (opens new window)中提到了&#xff0c;递归的实现就是&#xff1a;每一次递归调用都会把函数的局部变量、参数值和返回地…

【python】使用fitz包读取PDF文件报错“ModuleNotFoundError: No module named ‘frontend‘”

【python】使用fitz包读取PDF文件报错“ModuleNotFoundError: No module named ‘frontend’” 正确解决过程 在读取PDF文件时&#xff0c;我使用了fitz包&#xff0c;当使用代码import fitz导入该包时&#xff0c;出现了报错&#xff1a; 于是我直接使用以下代码安装fronten…

每天刷两道题——第十天

1.1和为k的子数组 给你一个整数数组 n u m s nums nums 和一个整数 k k k &#xff0c;请你统计并返回 该数组中和为 k k k 的子数组的个数 。子数组是数组中元素的连续非空序列。 输入&#xff1a;nums [1,2,3], k 3 输出&#xff1a;2 前缀和 1.2如何使用 前缀和的…