2023-04-10 网络流和最大流问题

网络流和最大流问题

1 网络流和最大流问题阐述

网络流基本概念

网络流图中,从源点出发,在满足每条边容量限制的条件下,汇点t最多能接收多少流量
网络流的基本概念

  • s:source
  • t:target

网络流需要满足的限制

  • 容量限制
  • 平衡限制:除了源点s和汇点t,对于每一个点,流入量等于流出量
  • 从源点s流出的流量,一定等于最终汇入汇点t的流量
    网络流问题需要满足的限制

引出最大流问题

网络流图中,从源点s出发,在满足每条边容量限制、平衡限制的条件下,汇点t最多能接收多少流量?

2 Ford-Fulkerson思想

Ford-Fulkerson思想的核心是当路径上的容量限制小于流量时,把流量改成负值加到图上,这个加上的流量叫残量,在残量图中不断找增广路径,直到没有增广路径为止~

手动求最大流的风险

  • 1.初始化网络流图:建立一个有向图,标注上流量(蓝色字体)和容量(黑色字体)

    初始化网络流图

  • 2.手动模拟不难得出该图的最大流应该是5,路线如下图所示:

    手动得到网络流的最大流

  • 3.手动找最大流方法的思想:随便找一条s到t的路径,只要路径还没满就接着找~直到无法再继续往t汇入流量。

    这个思路是有问题的,前面选择的路径不对很可能得不到正确的最大流.如下图,如果上来就走0->1->2->3的路线,路线上直接传流量3,那么后续其他路径也没法走了,最终t只能得到3,显然不是最大流
    手动模拟存在的问题
    手动模拟存在的问题2

引入Ford-Fulkerson思想

  • 1.针对上面手动法的问题,我们可以引入负流量和反向边,即虚拟一条2->1的流量值2,和原来的3抵消,1->2的流量还剩1,再从1->2把流入1的2个流量流入到3,即完成了最大流5的求解。这便是Ford-Fulkerson思想

    引入负流边

  • 2.残量图和增广路径的概念和图示
    • 增广路径:所有边的权值都大于0的图中的路径
    • 残量图:记录流量流过后,正向边权值剩余和反向边权值大小的图

    Ford-Fulkerson思想的理论描述

  • 3.上面描述经过理论抽象后为:在残量图中不断寻找增广路径,直到没有增广路径,汇入点的流量即为图的最大流。

    Ford-Fulkerson思想

3~4 Edmonds-Karp算法

不断进行BFS寻找增广路经和更新残量图,直到找不到增广路径。最后所有增广路径的流量加起来就是最大流。注意两个事项:

  • 1.残量图中,权值为0的边不能走(不管是正向边还是反向边,反向边代表可以回流的流量,前提是正向边已经流入了流量)
  • 2.每次BFS遍历到一条增广路径后,都要重新更新残量图,然后进行下一轮的BFS,按照上一步的原则,直到找不到增广路径为止

下面是一个详细的用上面思路找最大流的过程,以下图为例:
Edmonds-Karp算法模拟

  • 1.第1遍BFS遍历,得到一条增广路径0->1->3,取边0->11->3的较小权值2,所以从0出流量2,更新残量网络后如下:

    Edmonds-Karp算法模拟1

  • 2.第2遍BFS遍历,得到一条增广路径0->2->3,注意不能走权值为0的边2->11->3,取边0->22->3的较小权值2,所以从0出流量2到2,更新残量网络后如下:

    Edmonds-Karp算法模拟2

  • 3.第3遍BFS遍历,得到一条增广路径0-1->>2->3,注意不能走权值为0的边0->21->3,取边0->11->22->3的较小权值1,所以从0出流量1到1,更新残量网络后如下:

    Edmonds-Karp算法模拟3

  • 4.第4边BFS遍历,0的邻接边向外的权值都已经为0,无法在进行BFS遍历,所以算法执行完毕,最大流就是汇点所有临边的入流量值2+3=5

Edmonds-Karp算法实现和测试

  • 实现代码
  • 测试代码

7 网络流问题建模

最大流问题引入

参考博客:http://www.matrix67.com/blog/archives/5190

在一场职业棒球赛中,每队要打162场比赛
最终,所胜场次最多的队伍,为冠军
如果有平局,则进行加赛
在比赛过程中,如果发现一个队伍无论如何都不可能获冠,则直接淘汰
比如A队已经获得100胜, B队获得70胜,还剩29场比赛未打, 则B队淘汰

Team纽约巴尔的摩波士顿多伦多底特律
纽约New York75592803873
巴尔的摩Baltimore71632830274
波士顿Boston69662782000
多伦多Toronto63722777000
底特律Detroit49862734000

问题:目前排名第五的底特律Detroit是否还有希望夺冠?

问题建模和分析

关键:除了底特律以外的其他队互相打完比赛之后,能否都最多76场胜利(因为底特律剩下的比赛全赢了也就49+27=76胜)?
网球比赛的网络流模型

  • 源点s发出的边和权值表示指向的两个队之间的比赛,最多给输出的胜利场次;
  • 汇点汇入的权值表示是否能让底特律以外的几个队拿到76场胜利。76-75=1、76-71=5、76-69=7、76-63=13、76-49=17
  • 通过上面图的最大流如果大于27=76-49,表示底特律还有机会;如果小于27,表示底特律没机会了

提炼出图的信息为:

11 19
0 1 3
0 2 8
0 3 7
0 4 2
0 5 7
1 6 3
1 7 3
2 6 8
2 8 8
3 6 7
3 9 7
4 7 2
4 8 2
5 7 7
7 9 7
6 10 1
7 10 5
8 10 7
9 10 13

代码实现和结论

  • 实现代码
/***********************************************************
 * @Description : 最大流比赛问题之棒球比赛
 * @author      : 梁山广(Liang Shan Guang)
 * @date        : 2019/12/27 21:06
 * @email       : liangshanguang2@gmail.com
 ***********************************************************/
package Chapter14NetworkFlowsAndMaxFlows;

import Chapter11WeightedGraphAndMinimumSpanningTree.Section1To2WeightedGraph.ReadWeightedGraph;
import Chapter11WeightedGraphAndMinimumSpanningTree.Section1To2WeightedGraph.WeightedGraph;

public class BaseBall {
    public static void main(String[] args) {
        String filepath = "src/main/java/Chapter14NetworkFlowsAndMaxFlows/baseball.txt";
        WeightedGraph networkGraph = new WeightedGraph(true);
        ReadWeightedGraph.init(networkGraph, filepath);
        MaxFlow maxFlow = new MaxFlow(networkGraph, 0, 10);
        // 结果为26,表明剩下的27场比赛没法让底特律以外的队伍都<=76,所以底特律没机会夺冠了,可以被淘汰了
        System.out.println("当前网络0->10的最大流为:" + maxFlow.getMaxFlow());
    }
}
/**
 * 顶点数V = 11, 边数E = 19
 * 当前网络0->10的最大流为:26
 */

8 最大流算法总结

Edmonds-Karp算法总结

最大流算法总结

常见的求最大流的算法

算法时间复杂度
Edmonds-Karp算法O(VE^2)
Dinic算法O(VE^2)
MPM算法O(V^3)

更多相关问题

  • 最小割:和最大流问题很相似
  • 网络流量
  • 分配
  • 匹配问题(下一章第15章会讲)

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

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

相关文章

第三章 spring IOC与Bean环境搭建与应用

1、手动导入Lib包搭建环境 1.1、下载Apache Common Logging API https://commons.apache.org/proper/commons-logging/download_logging.cgi 1.2、下载spring https://repo.spring.io/ui/native/release/org/springframework/spring/5.3.13/ 名称作用docs包含 Spring 的 …

李宏毅2021春季机器学习课程视频笔记9-再谈宝可梦分类器

宝可梦与数码宝贝很类似。 明显数码宝贝的线条更加复杂&#xff0c;宝可梦更简单&#xff0c;可以从这个角度出发。 利用一些边缘检测工具&#xff08;&#xff43;&#xff41;&#xff4e;&#xff4e;&#xff59;&#xff09;&#xff0c;&#xff45;用来计算线条的复杂程…

CSDN,感谢遇见【我的一周年创作纪念日】

机缘 第一次遇见CSDN已经是7年前的事了&#xff0c;那时的我还是一名初二的学生&#xff0c;由于沉迷于玩具战争这款游戏&#xff08;很遗憾这款游戏已经停服&#xff09;&#xff0c;里面有许多大佬利用各种手段去开挂&#xff0c;所以我意外的接触到了浏览器抓包等计算机技术…

考研数二第十四讲 牛顿-莱布尼茨公式与用定义法求解定积分

牛顿-莱布尼茨公式 牛顿-莱布尼茨公式在微分与积分以及不定积分与定积分之间架起了一座桥梁&#xff0c;因此&#xff0c;这个公式又被称为微积分基本公式。 微积分基本公式的简单推导 在看微积分基本公式之前&#xff0c;我们先来看一个有点特殊的函数&#xff0c;积分上限…

HashMap和HashTable的区别

目录一、HashMap和HashTable的区别二、验证结论1.线程安全和不安全2.继承的父类不同3.对null key和null value的支持不同4.初始化和扩容方式不同一、HashMap和HashTable的区别 1.HashMap方法没有synchronize修饰&#xff0c;线程非安全&#xff0c;HashTable安全 拓展:HashTabl…

OctoClock CDA 2990

CDA 2990 CDA 2990为时钟和PPS分发设备&#xff0c;支持外部一路时钟和PPS输入&#xff0c;最高支持8路时钟和PPS输出。同时CDA 2990可选配带GPS模块版本&#xff0c;可外接GPS天线&#xff0c;支持通过GPS锁定时钟和PPS信号输出。CDA 2990主要用于多台USRP设备进行同步。 CDA…

康耐视Designer-通过康耐视VC5与Omron PLC CJ2MEthernet IP通讯详细设置步骤

测试使用软件版本 Designer Version: 2.7 EDS File Version: 1.01 CX Programmer Version: 9.2 Network Configurator Version: 3.56 测试使用硬件 Cognex Vision Controller VC5 CIC500&CIC2900 OMRON PLC: CJ2M CPU31 PLC端设置 1.在Network Configurator中安装…

算法 二叉树2 || 层序遍历 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111 二叉树的最小深度 222.完全二叉树的节点个数

102 二叉树的层序遍历 队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是图论中的广度优先遍历&#xff0c;只不过我们应用在二叉树上。 迭代法&#xff1a; /*** Definition for …

进来拿!最近疯传的154页微软 GPT-4早期实验报告:探究 AGI进化之路(全中文版)

这应该是&#xff0c;最近一段时间以来&#xff0c;关于 ChatGPT4.0剖析最全面的一份报告。 看懂10%&#xff0c;能帮我们对 ChatGPT 的认识&#xff0c;有一个质的跃升&#xff1b; 看懂50%&#xff0c;你将是分享 ChatGPT 知识领域最顶尖的那一拨人。 这份报告证明了 GPT-4…

若依数据隔离 ${params.dataScope} 替换 优化为sql 替换

若依数据隔离 ${params.dataScope} 替换 优化为sql 替换 安全问题:有风险的SQL查询&#xff1a;MyBatis解决 若依框架的数据隔离是通过 ${params.dataScope} 实现的 但是在代码安全扫描的时候$ 符会提示有风险的SQL查询&#xff1a;MyBatis 所以我们这里需要进行优化参考: M…

5分钟学会Ribbon负载均衡

文章目录一、Ribbon1.1 Ribbon的负载均衡流程&#xff1a;1.2 负载均衡策略1.2.1 内置的负载均衡策略1.2.2 如何修改负载均衡1.3 加载方式一、Ribbon 1.1 Ribbon的负载均衡流程&#xff1a; 获取可用的服务列表&#xff1a;客户端在进行服务调用之前&#xff0c;首先需要获取可…

如何基于ChatGPT+Avatar搭建24小时无人直播间

0 前言 最近朋友圈以及身边很多朋友都在研究GPT开发&#xff0c;做了各种各样的小工具小Demo&#xff0c;AI工具用起来是真的香&#xff01;在他们的影响下&#xff0c;我也继续捣鼓GPT Demo&#xff0c;希望更多的开发者加入一起多多交流。 上一篇结合即时通 IM SDK捣鼓了一个…

SpringAOP入门基础银行转账实例(进阶版)------------事务处理

SpringAOP入门基础银行转账实例**&#xff08;进阶版&#xff09;**------------事务处理 由上一节讲述的通过Connection和QueryRunner对事务进行的处理(详情可以去我之前写的博客文章&#xff1a;https://blog.csdn.net/m0_56245143/article/details/130069160?spm1001.2014…

VMware vSphere 8.0c - 企业级工作负载平台

ESXi 8.0.0 & vCenter Server 8.0.0 GA (General Availability) 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-03-30, VMware vSphere 8.0c 发…

静态库与动态库

库是已经写好的、成熟的、可复用的代码。在我们的开发的应用中经常有一些公共代码是需要反复使用的&#xff0c;就把这些代码编译为库文件。库可以简单看成一组目标文件的集合&#xff0c;将这些目标文件经过压缩打包之后形成的一个可执行代码的二进制文件。库有两种&#xff1…

Ubuntu硬盘分区、挂载

文章目录1、使用命令查看硬盘情况2、分区3、格式化分区4、挂载手动挂载自动挂载1、使用命令查看硬盘情况 sudo fdisk -l 可以看到这里有个未分区的4T硬盘 如&#xff1a;sdb 这样的是硬盘 sdb1 sdb2 这样的是分区&#xff0c;现在还没分区 2、分区 sudo parted /dev/sdb (s…

一切都是命中注定的!

“光锥之内就是命运”&#xff0c;这是刘慈欣的《三体黑暗森林》里一句话&#xff0c;如果我们看到一件事情正在发生&#xff0c;那么它早在过去无论是几秒前还是几千年前&#xff0c;就已经发生了&#xff0c;我们无法改变这个命运。 孔明叹曰&#xff1a;“谋事在人&#xf…

树莓派通过网线连接笔记本实现笔记本电脑Wifi的网络共享

基于windows电脑连接树莓派进行设置&#xff1a;通过通过一根网线&#xff0c;连接树莓派和电脑&#xff0c;使电脑和树莓派构成一个局域网&#xff0c;然后树莓派接收来自笔记本电脑wifi网络的共享网络。操作方法类似台式机通过网线共享笔记本电脑无线网络的步骤 1、 保证笔记…

总结816

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 高等数学&#xff1a;一元积分&#xff0c;算是彻底过一遍了&#xff0c;但还是需要再回顾一遍。今日一道变限积分求导出…

简单的单目测距实验

一、原理 简单的单目测距方法&#xff0c;假设相机平面和物体平面平行&#xff0c;相机正对着物体表面拍摄&#xff0c;则可以利用相似三角形法。 用相似三角形计算物体或者目标到相机的距离&#xff0c;将使用相似三角形来计算相机到一个已知的物体或者目标的距离。 假设有…