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

news2024/12/22 20:55:10

目录

  • 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.coloradmin.cn/o/1368988.html

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

相关文章

leetcode 每日一题 2024年01月09日 字符串中的额外字符

题目 字符串中的额外字符 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割 s &…

解决命令行无法启动scrapy爬虫

前言 最近在准备毕设项目&#xff0c;想使用scrapy架构来进行爬虫&#xff0c;找了一个之前写过的样例&#xff0c;没想到在用普通的启动命令时报错。报错如下 无法将“scrapy”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径…

【AI】AI和点云(1/2)

目录 一、什么是点云 二、点云的应用领域 三、点云的创建 四、点云感知 一、什么是点云 在三维技术领域中&#xff0c;点云被定义为一种数据结构&#xff0c;用于表示三维空间中一组离散的点。这些点通常由它们的坐标&#xff08;x&#xff0c;y&#xff0c;z&#xff09;…

全视通以“物联数据中台+边缘信息化”,建设“三位一体”智慧医院

随着医疗信息化的不断深入&#xff0c;智慧医院已经成为医疗行业的发展方向。智慧医院是指利用信息技术和物联网技术&#xff0c;实现医疗服务、医疗管理和医疗保障的高效协同&#xff0c;提高医疗质量和安全&#xff0c;降低医疗成本&#xff0c;满足患者和医务人员的需求&…

Java_Swing程序设计

swing组件允许编程人员在跨平台时指定统一的外观和风格。 Swing组件通常被称为轻量级组件&#xff0c; JFrame在程序中的语法格式&#xff1a; JFrame jfnew JFrame(title); Container containerjf.getContentPane(); jf:JFrame类的对象 container:Container类的对象。 J…

Flutter - Android 安卓 消息推送FireBase notification 手机状态栏图标不显示或 白板、白底问题。

一、问题&#xff1a; 使用flutterfirebase 开发进行消息推送时&#xff0c;安卓真机推送消息 状态栏的图标显示白色方块。 二、原因&#xff1a; 从Android 5.0&#xff08;Lollipop&#xff09;开始&#xff0c;随着Material Design的引入&#xff0c;Android的设计语言和U…

单因素方差分析--R

任务说明 三个剂量水平的药物处理受试者&#xff0c;每个剂量水平十个受试者&#xff0c;现在收集到数据后&#xff0c;问&#xff1a; 药物剂量水平显著影响受试者的response&#xff1f; 或者不同剂量药物处理受试者有显著效果的差异吗&#xff1f; 数据 library(tidyvers…

c JPEG编码,但有错误

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h> //v4l2 头文件 #include <strin…

3. SPSS数据文件的基本加工和处理

如何获取SPSS自带的案例数据文件&#xff1f; 首先找到SPSS的安装目录&#xff0c;然后找到Samples文件夹 可以看到有不同语言版本&#xff0c;选择简体中文 就能看到很多.sav文件 数据文件的整理 个案排序 单值排序 例&#xff1a;对于下面的数据集&#xff0c;将工资按…

拼多多API:从数据中挖掘商业价值的力量

随着大数据时代的来临&#xff0c;数据已经成为企业决策和创新的基石。拼多多API作为电商领域的重要接口&#xff0c;为企业提供了从数据中挖掘商业价值的机会。通过拼多多API&#xff0c;企业可以获取丰富的用户数据、商品数据和交易数据&#xff0c;从而深入了解市场需求、优…

【leetcode】字符串中的第一个唯一字符

题目描述 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 用例 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2: 输入: s “loveleetcode” 输出: 2 示例 3: 输入: s “aabb”…

Flink CDC使用

Flink 环境准备 Flink 版本对应的CDC版本 两个jar包上传到flink bin目录下 flink-sql-connector-mysql-cdc mysql-connector-java 重启Flink集群

跟我学java|Stream流式编程——Stream 的中间操作

书接上回&#xff0c;继续研究。 过滤操作&#xff08;filter&#xff09; 过滤操作&#xff08;filter&#xff09;是 Stream API 中的一种常用操作方法&#xff0c;它接受一个 Predicate 函数作为参数&#xff0c;用于过滤 Stream 中的元素。只有满足 Predicate 条件的元素会…

搭建Windows版Redis集群

redis集群 Redis单机版安装 链接: Redis官网下载地址 下载完成后解压至指定目录 打开一个 cmd 窗口 使用 cd 命令切换目录到 E:\Redis\Redis 运行&#xff1a; redis-server.exe redis.windows.confRedis集群的安装 1.构建集群节点目录 创建一个redis-cluster目录用于存放…

计算机网络 - 路由器查表过程模拟 C++(2024)

1.题目描述 参考计算机网络教材 140 页 4.3 节内容&#xff0c;编程模拟路由器查找路由表的过程&#xff0c;用&#xff08;目的地址 掩码 下一跳&#xff09; 的 IP 路由表以及目的地址作为输入&#xff0c;为目的地址查找路由表&#xff0c;找出正确的下一跳并输出结果。 1.…

ATA-P系列功率放大器在压电叠堆中的作用是什么

功率放大器在压电叠堆中的作用是为压电叠堆提供足够的电能&#xff0c;使其产生强大的机械振动。以下为您详细介绍一下。 压电叠堆是一种利用压电效应产生振动的器件。通过在叠堆上施加电压&#xff0c;叠堆内部的压电材料会产生机械应变&#xff0c;从而引起叠堆的振动。这种振…

C++的一些书籍整理(个人学习)

UNIX环境高级编程&#xff08;第三版&#xff09; UNXI网络编程卷1 网络编程的笔记 收藏 我会了 一堆书 这个仓 数据库连接池原理介绍常用连接池介绍

7.3 CONSTANT MEMORY AND CACHING

掩模数组M在卷积中的使用方式有三个有趣的属性。首先&#xff0c;M阵列的大小通常很小。大多数卷积掩模在每个维度上都少于10个元素。即使在3D卷积的情况下&#xff0c;掩码通常也只包含少于1000个元素。其次&#xff0c;在内核执行过程中&#xff0c;M的内容不会改变。第三&am…

移动端对大批量图片加载的优化方法(三)

移动端对大批量图片加载的优化方法&#xff08;三&#xff09;Flutter 本篇主要从Flutter开发中可以使用到的对大批量图片加载的优化方法进行整理。 1.合适的图片格式 详情请参考移动端对大批量图片加载的优化方法&#xff08;一&#xff09;。 2.缓存机制 在Flutter中&am…

2023年山东省职业院校技能大赛高职组信息安全管理与评估—内存取证解析

内存取证 1、从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位); volatility -f 1.vmem imageinfo 操作系统我们一般取第一个就可以了