【Algorithms 4】算法(第4版)学习笔记 19 - 6.0.4 网络流算法

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1:介绍
      • 1.1:最小切分问题
      • 1.2:最大流问题
      • 1.3:小结
      • 2:Ford-Fulkerson 算法(FF 算法)
      • 2.1:介绍
      • 2.2:问题
      • 3:最大流量 - 最小切分定理 maxflow-mincut theorem
      • 3.1:流和切分之间的关系
      • 3.2:定理以及证明
      • 3.3:计算最大流中的最小切分
      • 4:运行时间分析
      • 4.1:FF 算法问题
      • 4.2:整数容量 FF 算法
      • 4.3:FF 算法最坏情况
      • 4.4:增广路径的选择
      • 5:Java 实现
      • 5.1:流网络表示
      • 5.2:流量网络中的边的 API
      • 5.3:Java实现:流量边
      • 5.4:流量网络的 API
      • 5.5:Java 实现:流量网络
      • 5.6:流量网络:邻接列表表示
      • 5.7:寻找最短增广路径(BFS)
      • 5.8:Java 实现:FF 算法
      • 6:应用

前言

本篇是在书本第 4 章学习基础上进行拓展,主要内容包括:问题介绍Ford-Fulkerson 算法最大流量 - 最小切分定理运行分析算法 Java 实现

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《6.0.4 网络流算法》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。
注3:如果 PPT 截图中没有翻译,会在下面进行汉化翻译,因为内容比较多,本文不再一一说明。

1:介绍

1.1:最小切分问题

![L16-64MaxFlow_02]

定义:

![L16-64MaxFlow_05]

定义: st 切分(st-cut)是一个顶点集合的划分,将其分为两个不相交的子集 A 和 B,其中源节点 s 属于集合 A,目标顶点(汇节点) t 属于集合 B。

定义: 这个切分的容量(Capacity)是从集合 A 到集合 B 的所有边的容量之和。

最小 st 切分问题: 找到具有最小容量的切分。

1.2:最大流问题

![L16-64MaxFlow_08]

定义:

![L16-64MaxFlow_11]

定义: st 流(简称流)是一种对边的赋值方案,需满足以下条件:

  • 容量约束:每条边的流量必须在0到该边的容量之间,即 0 ≤ 边的流量 ≤ 边的容量。
  • 局部平衡:除了源点s和汇点t外,每个顶点的流入流量等于流出流量。

定义: 流的值是指在汇点 t 处的流入流量。

最大 st 流(最大流)问题: 找到具有最大值的流。

1.3:小结

![L16-64MaxFlow_14]

值得注意的事实: 这两个问题是双重的!

2:Ford-Fulkerson 算法(FF 算法)

2.1:介绍

摘自书本《6.0.4.4 Ford-Fulkerson算法》:

在1962年,L.R.Ford 和 D.R.Fulkerson 发明了一种解决最大流量问题的有效方法。它是一种沿着由起点到终点的路径逐步增加流量的通用方法,因此它也是同类算法的基础。在经典文献中它被称为 Ford-Fulkerson 算法,但它也被称为增广路径算法。

初始化:

![L16-64MaxFlow_16]

初始流量为零。

想法:通过增加的路径增大流量

![image-20240317134724648]

增广路径: 寻找一条从源点 s 到汇点 t 的无向路径,且该路径需要满足以下条件:

  • 沿路径上的正向边(即从当前顶点指向路径下一个顶点的边)仍有增加流量的空间(未达到其容量上限);
  • 沿路径上的逆向边(即与正向边方向相反的边,在流网络中通常表示反向流动)存在非零流量(即并非为空,可以减少流量)。

第 1 次增广路径:

![image-20240317134940967]

第 2 次增广路径:

![image-20240317135008241]

第 3 次增广路径:

![image-20240317135413162]

第 4 次增广路径:

![image-20240317135719996]

没有更多的增广路径:

![image-20240317135931025]

2.2:问题

![L16-64MaxFlow_22]

Ford-Fulkerson 算法:

![image-20240317140418140]

问题:

  • 如何计算最小切分?
  • 如何寻找增广路径?
  • 如果 FF 算法终止,它是否总是计算出了最大流?
  • FF 算法是否总会终止?如果是,会在多少次增广之后终止?

3:最大流量 - 最小切分定理 maxflow-mincut theorem

maxflow-mincut theorem 也被翻译成 最大流 - 最小割定理,本文采用书本的翻译。

3.1:流和切分之间的关系

![L16-64MaxFlow_26]

定义: 对于一个切分集 (A, B),其净流量是通过该割集中从集合 A 到集合 B 的所有边的流量之和减去从集合 B 到集合 A 的所有边的流量之和。

![L16-64MaxFlow_27]

流值引理: 设 f 为任意一个流,(A, B) 为任意一个切分集。则 (A, B) 之间的净流量等于流 f 的值。

直观理解: 这是基于流量守恒原则。

证明: 通过归纳法对集合 B 的大小进行论证。

  • 基础情况:当 B = {t} 时。
  • 归纳步骤:当将任何顶点从集合 A 移动至集合 B 时,由于局部平衡原理,上述结论依然成立。

推论: 源点 s 的流出流量等于汇点 t 的流入流量,两者都等于流的值。

对应书本命题 E:

![image-20240317142700938]

弱对偶性:

![L16-64MaxFlow_28]

弱对偶性: 设 f 为任意一个流,并设 (A, B) 为任意一个切分集。
那么,流 f 的值小于等于该切分集的容量。

证明: 流 f 的值 = 切分集 (A, B) 净流量 <= 切分集 (A, B) 总容量。
=:流值引理;<=:流量受容量限制)

3.2:定理以及证明

![image-20240317143815702]

对应书本命题 F:

![image-20240317144131259]

3.3:计算最大流中的最小切分

![L16-64MaxFlow_32]

计算由最大流 f 决定的最小切分 (A, B) 的方法:

  • 根据增广路径定理,针对当前最大流 f,不存在可以进一步增广的路径。
  • 计算集合 A:它是由所有通过一条不包含满容量正向边或空容量逆向边的无向路径与源点 s 相连的顶点组成的集合。

4:运行时间分析

4.1:FF 算法问题

![L16-64MaxFlow_34]

问题:

  • 如何计算最小切分? (Easy.)
  • 如何寻找增广路径? (BFS.)
  • 如果 FF 算法终止,它是否总是计算出了最大流? (Yes.)
  • FF 算法是否总会终止?如果是,会在多少次增广之后终止?
    (Yes,前提是边容量是整数 (或者仔细选择增强路径);需要巧妙分析)

4.2:整数容量 FF 算法

![L16-64MaxFlow_35]

关键特性: 边的容量为介于 1 和 U 之间的整数。

不变式: 在整个 FF 算法过程中,流的值均为整数值(每条边上的流量都是整数)。
证明(通过归纳法):

  • 找到的瓶颈容量为整数。
  • 对于每条边,其流量在增广过程中会按瓶颈容量整数单位增加或减少。

命题: 增广次数不超过最大流的值。
证明: 每次增广都会至少使流的值增加 1。

整数性定理(对于某些应用场景极为关键): 存在一个整数值的最大流。
证明: 由于 FF 算法最终会停止运行,并找到一个整数值的最大流。

对应书本推论:

![image-20240317150840710]

4.3:FF 算法最坏情况

![image-20240317151332473]

坏消息: 即使边的容量为整数,增广路径的数量也可能恰好等于所求最大流的值。

初始状态:

![image-20240317151511970]

第 1 次增广路径:

![image-20240317151624722]

第 2 次增广路径:

![image-20240317151648453]

第 3 次增广路径:

![image-20240317151744875]

第 4 次增广路径:

![image-20240317151754831]

……

第 199 次增广路径:

![image-20240317151822222]

第 200 次增广路径:

![image-20240317151841519]

结束。

![L16-64MaxFlow_44]

好消息: 这种情况很容易避免。[可以使用最短/最宽路径算法]

4.4:增广路径的选择

![L16-64MaxFlow_45]

在选择增广路径时要慎重考虑。

  • 某些选择会导致指数级时间复杂度的算法。
  • 明智的选择则会导向多项式时间复杂度的算法。

![L16-64MaxFlow_46]

选择增广路径算法:

  • 最短路径算法:边数量最小。
  • 最宽路径算法:最大瓶颈容量。

5:Java 实现

5.1:流网络表示

![L16-64MaxFlow_48]

流边数据类型: 为边 e = v → w 定义一个数据结构,其中包含流量属性 fe 和容量属性 ce

流网络数据类型: 必须能够处理边 e = v → w 两个方向的信息,即将 e 同时包含在顶点 v 和 w 的邻接表中。

剩余容量:

  • 正向边(从 v 到 w):剩余容量 = ce - fe
  • 反向边(从 w 到 v):剩余容量 = fe

增广流量:

  • 正向边(从 v 到 w):增加流量值 ∆。
  • 反向边(从 w 到 v):减少流量值 ∆。

![L16-64MaxFlow_49]

剩余网络: 这是一种流网络的有效视角。(包含了所有具有正剩余容量的边)

关键要点: 在原网络中的增广路径与剩余网络中的有向路径一一对应。

对应书本中的说明:

![image-20240317154439026]

5.2:流量网络中的边的 API

![image-20240317154551633]

5.3:Java实现:流量边

edu.princeton.cs.algs4.FlowEdge

![image-20240317155204793]

edu.princeton.cs.algs4.FlowEdge#residualCapacityTo

![image-20240317155319042]

edu.princeton.cs.algs4.FlowEdge#addResidualFlowTo

![image-20240317155335791]

5.4:流量网络的 API

![image-20240317155438184]

5.5:Java 实现:流量网络

edu.princeton.cs.algs4.FlowNetwork

![image-20240317155552347]

![image-20240317155640306]

5.6:流量网络:邻接列表表示

![image-20240317160412457]

5.7:寻找最短增广路径(BFS)

edu.princeton.cs.algs4.FordFulkerson#hasAugmentingPath

![image-20240317160831992]

5.8:Java 实现:FF 算法

edu.princeton.cs.algs4.FordFulkerson

![image-20240317161052673]

![image-20240317161118916]

6:应用

![L16-64MaxFlow_59]

最大流量/最小切分问题是广泛应用于多种问题解决模型的一种方法。

  • 数据挖掘
  • 露天采矿规划
  • 二分匹配
  • 网络可靠性分析
  • 棒球联赛淘汰赛制分析
  • 图像分割技术
  • 网络连通性研究
  • 分布式计算问题
  • 统计数据安全保护
  • 平等稳定婚姻匹配问题
  • 多摄像机场景重建
  • 国土安全传感器布局设计
  • ……

(完)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ConsiStory:Training-Free的主体一致性生成

Overview 一、总览二、PPT详解 ConsiStory 一、总览 题目&#xff1a; Training-Free Consistent Text-to-Image Generation 机构&#xff1a;NVIDIA, Tel-Aviv University 论文&#xff1a;https://arxiv.org/pdf/2402.03286.pdf 代码&#xff1a;https://consistory-paper.g…

Github 2024-03-17 开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目2Rust项目1JavaScript项目1C#项目1非开发语言项目1Solidity项目1《Hello 算法》:动画图解、一键运行的数据结构与算…

OPC UA 服务器的Web访问

基于Web 的应用非常普及&#xff0c;例如基于web 的SCADA &#xff0c;物联网 Dashboard 等等&#xff0c;那么基于Web 的应用如何访问OPC UA 服务器呢&#xff1f;本博文讨论这方面的问题。 Web 的通信方式 Web 是我们通常讲的网站&#xff0c;它由浏览器&#xff0c;HTTP 服…

腾讯云有免费服务器吗?在哪领取?

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

elementUI两个select单选框联动

实现需求&#xff1a;两个单选框内容两栋&#xff0c;在选择第一个时&#xff0c;第二个选框能自动更新对应选项。且在切换第一个选项内容时&#xff0c;第二个选框会被清空且切换到新的对应选项。 设置值班班次和备班情况两个选项 &#xff0c;完整代码如下&#xff1a; <…

【数据结构和算法初阶(C语言)】二叉树学习日记①--树的概念/二叉树的概念、知识和存储结构

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树结构在实际当中的运用 1.4 树的表示 ①孩子兄弟表示法 ②双亲表示法--孩子找爸爸&#xff08;并查集是一个应用&#xff09; 2.二叉树概念及结构 2.1概念 现实中的二叉树模型&#xff1a; 2.3 特殊的二叉树&#xff1…

【C语言入门】浮点型数据在内存中的存储

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 ​编辑 引言 引例 一、浮点型在内存中的存储方式 1.1 …

Nodejs 第五十六章(爬虫)

什么是爬虫&#xff1f; 爬虫&#xff0c;也称为网络爬虫或网络蜘蛛&#xff0c;是指一种自动化程序或脚本&#xff0c;用于在互联网上浏览和提取信息。爬虫模拟人类用户在网页上的行为&#xff0c;通过HTTP协议发送请求&#xff0c;获取网页内容&#xff0c;然后解析并提取感…

Day18 Java学生管理系统

Day18 Java学生管理系统 一、需求分析 考虑的方面&#xff1a; 用户需求、功能需求、非功能性需求、约束条件、优先级和权衡、可追踪性、需求验证。 二、项目搭建 搭建学生管理系统 1、创建项目的main ;pojo ; sms ; utils包。 2、编写系统的 增&#xff08;涉及到扩容–…

一. 并行处理与GPU体系架构-GPU并行处理

目录 前言0. 简述1. 这个小节会涉及到的关键字2. CPU与GPU在并行处理的优化方向3. Summary总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第一章——并行处理与GPU体…

4.1_5 文件存储空间管理

文章目录 4.1_5 文件存储空间管理&#xff08;一&#xff09;存储空间的划分与初始化&#xff08;二&#xff09;存储空间管理——空闲表法&#xff08;三&#xff09;存储空间管理——空闲链表法&#xff08;1&#xff09;空闲盘块链&#xff08;2&#xff09;空闲盘区链 &…

腾讯云企业用户可以申请免费服务器试用吗?

腾讯云企业用户可以申请免费服务器试用吗&#xff1f;可以的&#xff0c;腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核…

拌合楼内部管理系统开发(三) 继续功能模块及数据表设计-收发管理模块(无人值守功能)

前言:继续闭门造车 继续发挥,上一篇写到了生产管理,今天开始做无人值守的功能模块的设计了.核心就是收发管理的模块了. 一、发货的工作流程&#xff1a; 我设想的发货流程如下&#xff1a; 1. 发货的源头指令来源于生产计划&#xff1a; 生产计划要素是需要生产的产品&#xff…

解决google Chorme 隐私设置错误

问题&#xff1a; 我们在使用浏览器的时候&#xff0c;出现隐私设置错误“您的链接不是私密连接”&#xff0c;如下图所示&#xff1a; 第一步开始来解决隐私设置错误&#xff0c;打开浏览器之后&#xff0c;点击右上方的三点图标&#xff0c;选择设置&#xff0c;如下图所示&…

基于支持向量机SVM的沉降预测,SVM详细原理,Libsvm详解

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接:基于支持向量机SVM的沉降预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/88947544 SVM应用实例,基于支持向量机SVM的沉降预测…

MYSQL报 - Lock wait timeout exceeded; try restarting transaction

前言 今天在使用数据库编辑数据时&#xff0c;页面突然卡主&#xff0c;退出程序后重新编辑&#xff0c;发现报错&#xff0c;1205 - Lock wait timeout exceeded&#xff1b; try restarting transaction&#xff08;如下图&#xff09;&#xff0c;正巧在和同事开会&#xf…

基于Springboot和Redis实现的在线选课系统

1.项目简介 1.1 介绍 毕业设计真的就是demo吗&#xff1f;作为工作前的最后一个校园项目&#xff0c;毕业设计应当尽可能的贴近企业实战&#xff0c;业务不必很复杂&#xff0c;但要做到麻雀虽小五脏俱全。本期学长跟大家一起分享如何开发一个在线选课系统&#xff0c;需求也…

如何实现队列和栈的转化(c语言)

文章目录 一.什么是栈二.什么是队列三.怎么把栈变成队列&#xff08;力扣&#xff09;四.怎么把队列变成栈&#xff08;力扣&#xff09;总结 一.什么是栈 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定权在表尾进行插入和删除操作的线性…

从政府工作报告中的IT热词统计探计算机行业发展(二)人工智能+:3次

政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&#xff0c;从政府工作报告中探寻计算…

嵌入式学习39-程序创建数据库及查找

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开 数据库文件(创建一个数据库连接) 参数: filename: …