40.弗洛伊德(Floyd)算法

概述

我们此前拆解过迪杰斯特拉(Dijkstra)算法,与它一样,弗洛伊德(Floyd)算法也是用于寻找给定的加权图中顶点间最短路径的算法。该算法是1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德及其团队发现的,以主要创始人 弗洛伊德 命名。
迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径,而弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。

分析

设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij,则vi到vj的最短路径为: min((Lik+Lkj),Lij),vk的取值为无向图中所有顶点,则可获得vi到vj的最短路径。
至于vi到vk的最短路径Lik或者vk到vi的最短路径Lkj,是以同样的方式获得。

我们还是回到“郝乡长”的政绩工程——得胜乡的七村修路问题
在这里插入图片描述

首先是对于各个顶点之间举例的初始化
在这里插入图片描述
对于前驱关系也是我们在算法开始之前需要明晰的
在这里插入图片描述
在第一轮循环中,以A(下标:0)作为中间顶点,距离表和前驱关系会更新为:

在这里插入图片描述
以A为中间节点的可能性全部遍历,就会得到更新的距离表和前驱关系。

(无向图)将A作为中间节点情况有:

分析距离表的替换:

• C-A-G 距离 7+2 = 9; --------> CG (N) ------>CG(9)
• C-A-B 距离 7+5 = 12; --------> CB(N) ------>CB(12)
• G-A-B 距离 2+5 = 7; --------> GB(3) 因为7>3所以不做替换!

分析前驱关系表的替换:

• C通过A到G,故前驱关系表中,C行G列的前驱节点替换为A;
• G通过A到C,故前驱关系表中,G行C列的前驱节点替换为A;
• C通过A到B,故前驱关系表中,C行B列的前驱节点替换为A;
• B通过A到C,故前驱关系表中,B行C列的前驱节点替换为A;

如何将A作为中间节点的情况都考虑到?

中间顶点数组{A,B,C,D,E,F,G} 取A(k[0])—> …
出发顶点数组{A,B,C,D,E,F,G} 取A (i[0]) —>取B(i[1])
终点数组{A,B,C,D,E,F,G} 遍历 (j=1,2,3,…) —>(j=1,2,3,…)
时间复杂度: O(n3),较高

代码实现

public class FloydAlgorithm {public static void main(String[] args) {char[] vertex = {'A','B','C','D','E','F','G'};//创建邻接矩阵int [][] matrix = new int[vertex.length][vertex.length];final int N = 65535;matrix[0] = new int[]{0,5,7,N,N,N,2};matrix[1] = new int[]{5,0,N,9,N,N,3};matrix[2] = new int[]{7,N,0,N,8,N,N};matrix[3] = new int[]{N,9,N,0,N,4,N};matrix[4] = new int[]{N,N,8,N,0,5,4};matrix[5] = new int[]{N,N,N,4,5,0,6};matrix[6] = new int[]{2,3,N,N,4,6,0};//创建图Graph graph = new Graph(vertex.length, matrix, vertex);graph.floyd();graph.show();}
}//图
class Graph{private char[] vertex;//存放顶点的数组private int [][] dis;//保存,从各个顶点出发到其它顶点的距离,最后的结果,也是保留在该数组private int [][] pre;//保存到达目标顶点的前驱顶点/*** @param length 大小* @param matrix 邻接矩阵* @param vertex 顶点数组*/public Graph(int length,int [][] matrix,char[]vertex) {this.vertex = vertex;this.dis = matrix;this.pre = new int[length][length];//对pre进行初始化,注意存放的是前驱顶点的下标for (int i = 0; i < length; i++) {Arrays.fill(pre[i],i);}}//显示pre数组和dis数组public void show(){char[] vetex = {'A','B','C','D','E','F','G'};for (int k = 0; k < dis.length; k++) {//先将pre数组输出的一行for (int i = 0; i < dis.length; i++) {System.out.print(vetex[pre[k][i]] + " ");}System.out.println();//输出dis数组的一行数据for (int i = 0; i < dis.length; i++) {System.out.print("("+vertex[k]+"到"+vertex[i]+"的最短路径"+dis[k][i]+") ");}System.out.println();System.out.println();}}//弗洛伊德算法public void floyd(){int len = 0 ;//变量保存//对中间顶点的遍历, k 就是中间顶点的下标for (int k = 0; k < dis.length; k++) {//从i顶点开始出发 [ A,B,C,D,E,F,G ]for (int i = 0; i < dis.length; i++) {//到达j顶点  [ A,B,C,D,E,F,G ]for (int j = 0; j < dis.length; j++) {len = dis[i][k]+dis[k][j];//求出i顶点出发,经过k中间顶点,到达j顶点距离if (len<dis[i][j]){//如果len < 两点的直连距离dis[i][j] = len;//更新距离pre[i][j] =pre[k][j];//更新前驱节点}}}}}
}

关注我,共同进步,每周至少一更。——Wayne

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

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

相关文章

【API篇】九、Flink的水位线

文章目录 1、Flink时间语义2、事件时间和窗口3、水位线4、水位线和窗口的工作原理 1、Flink时间语义 事件时间处理时间 举个例子就是&#xff0c;一条数据在23:59:59产生&#xff0c;在00:00:01被处理&#xff0c;前者为事件时间&#xff0c;后者为处理时间。 从Flink1.12版本…

【PyQt学习篇 · ④】:QWidget - 尺寸操作

文章目录 QWidget简介QWidget大小位置操作案例一案例二 QWidget尺寸限定操作案例 内容边距案例 QWidget简介 在PyQt中&#xff0c;QWidget是一个基本的用户界面类&#xff0c;用于创建可见的窗口组件。QWidget可以包含多种类型的子组件&#xff0c;如QPushButton、QLabel、QLi…

一文带你在GPU环境下配置YOLO8目标跟踪运行环境

本文介绍GPU下YOLO8目标跟踪任务环境配置、也即GPU下YOLO8目标检测任务环境配置。 YOLO8不仅仅可以实现目标检测&#xff0c;其还内置有Byte-Tracker、Bot-Tracker多目标跟踪算法。可以实现行人追踪统计、车流量跟踪统计等功能。值得注意的是Byte-Tracker、Bot-Tracker多目标跟…

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四)

这篇博客是之前文章&#xff1a; Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;一&#xff09;Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;二&a…

挖掘业务场景的存储更优解

文章目录 第1章 如何用更优的数据存储方案&#xff0c;打造更稳定的架构&#xff1f;1.1 选用适合自己的数据存储方案1.1.1 关系型数据库1.1.2 非关系型数据库1.1.3 内存数据库 1.2 打造更稳定的架构1.2.1 分布式架构1.2.2 容灾备份1.2.3 监控报警1.2.4 自动化运维 1.3 案例分析…

pdf转jpg的方法【ps和工具方法】

pdf转jpg的方法&#xff1a; 1.photoshop办法&#xff1a; pdf直接拖入ps中&#xff0c;另存为*.Jpg文件即可 另外注意的时候&#xff0c;有时候别人给你pdf文件中包含你需要的jpg文件&#xff0c;千万不要截图进入ps中&#xff0c;直接把文件拖入ps中&#xff0c;这样的文件…

sql-50练习题6-10

sql练习题6-10题 前言数据库表结构介绍学生表课程表成绩表教师表 0-6 查询"李"姓老师的数量0-7 查询学过"李四"老师授课的同学的信息0-8 查询没学过"李四"老师授课的同学的信息0-9 查询学过编号为"01"并且也学过编号为"02"的…

【八】Linux成神之路

Linux成神之路 简介&#xff1a;最近梳理了一下自己linux系统的学习历程&#xff0c;感觉整个成长过程就很顺利&#xff0c;并没有走弯路&#xff0c;于是想着可以不可以把自己linux系统学习的路线记录下来&#xff0c;能够在大家成长的路上有一点帮助&#xff0c;就在这样的一…

前端重新部署如何通知用户更新

标题解决方案 常用的webSocket解决方案 webSocket; 大致逻辑思考应该是前端在部署好后向服务器发送一个状态变更通知&#xff1b;服务器接收后主动向前端push&#xff1b;前端通过心跳检测&#xff0c;接收到相关更新时弹出提示&#xff0c;让用户确认更新&#xff1b; 缺点&a…

国产CAN总线收发芯片DP1042 兼容替换TJA1042

说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片&#xff0c;可应用于卡车、公交、小汽车、工业控制等领域&#xff0c;支持 5Mbps CAN FD 灵活数据速率&#xff0c;具有在总线与 CAN 协议控制器之间进行差分信号传输的能力&#xff0c;完全兼容“ISO…

基于aop 代理 Sentinel Nacos配置控制包装类实现原理

基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理 Hi&#xff0c;我是阿昌&#xff0c;今天记录下看sentinel源码结合业务实现的思路基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理&#xff1b;下面并不会手把手的记录方案的实现…

拜耳阵列(Bayer Pattern)和解马赛克简介

拜尔阵列 典型的图像传感器&#xff08;例如我们在数码相机中使用的图像传感器&#xff0c;主要有CCD, CMOS&#xff09;由许多单独的光电传感器组成&#xff0c;所有这些传感器都会捕获光线。这些光电传感器本身能够捕获光的强度&#xff0c;但不能捕获其波长&#xff08;颜色…

蓝桥杯每日一题2023.10.25

乘积尾零 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由于需要相乘的数很多&#xff0c;所以我们不能直接进行暴力模拟&#xff0c;我们知道10 2 * 5&#xff0c; 所以我们只需要找出这个数2和5的个数&#xff0c;其中2和5个数小的那个则为末尾0出现的个数 #include<bi…

Postman如何做接口自动化测试?

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完…

在Win11上部署ChatGLM3详细步骤

023年10月27日&#xff0c;智谱AI于2023中国计算机大会&#xff08;CNCC&#xff09;上&#xff0c;推出了全自研的第三代基座大模型ChatGLM3及相关系列产品&#xff0c;这也是智谱AI继推出千亿基座的对话模型ChatGLM和ChatGLM2之后的又一次重大突破。此次推出的ChatGLM3采用了…

如何使用navicat图形化工具远程连接MariaDB数据库【cpolar内网穿透】

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

私有云:【10】VCenter安装win10

私有云&#xff1a;【10】VCenter安装win10 1、ESXI挂载win10镜像2、VCenter安装win102.1、创建虚拟机2.2、启动虚拟机 此WIN10用来作为以后的远程桌面 1、ESXI挂载win10镜像 2、VCenter安装win10 2.1、创建虚拟机 创建虚拟机 设置名称下一步 选择计算机资源 选择NFS存储 设置…

DXF文件写入多边形和名称属性,可在Global Mapper和ArcGIS打开

DXF文件写入多边形和名称属性&#xff0c;可在Global Mapper和ArcGIS打开 目标效果 为了实现下图的效果&#xff0c;学习了一下dxf格式的相关内容。 官方文档价值很高&#xff0c;但是结合实例.dxf文件看学习起来更快。 免费下载实例 下面将介绍dxf文件的格式规范&#xff0…

MODBUS-RTU从站通信(SMART PLC作为MODBUS-RTU从站)

SMART PLC作为MODBUS-RTU主站通信请参考下面文章链接: 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客文章浏览阅读2.5k次,点赞5次,收藏10次。MODBUS通讯非常简单、应用也非常广泛,有些老生常谈的问题,这里不再赘述,感兴趣的可以参看…

RealVNC Enterprise 7.7.0 Crack

RealVNC连接_旗舰产品 RealVNC Connect 是为需要强大安全性、弹性和安心的组织提供的远程访问解决方案。 设备访问 按需协助 随时随地安全访问和管理任何设备 通过安全的远程访问让您的组织保持联系&#xff0c;帮助您提高生产力并促进更广泛的协作。 随时随地安全远程访问和…