【算法】弗洛伊德(Floyd)算法求最短路径

目录

1.弗洛伊德(Floyd)算法介绍

2.弗洛伊德算法图解分析

 2.1思路:

2.2图和矩阵的准备

2.3弗洛伊德算法的步骤:

2.4疑问

3.弗洛伊德算法的代码实现

3.1创建图并显示距离表与前驱表

3.2完整代码


1.弗洛伊德(Floyd)算法介绍

  1. 弗洛伊德算法用于计算图中各个顶点之间的最短路径
  2. 迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径
  3. 弗洛伊德算法 VS 迪杰斯特拉算法:弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看作被访问顶点,求出从每一个顶点到其他顶点的最短路径;迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径。

2.弗洛伊德算法图解分析

 2.1思路:

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

2.2图和矩阵的准备

示例图
初始各顶点之间距离表
初始顶点前驱关系

2.3弗洛伊德算法的步骤:

第一轮循环中,以 A(下标为 0) 作为中间顶点【即把 A 作为中间顶点的所有情况都进行遍历,就会得到更新距离表和前驱关系】,距离表和前驱关系更新为:

距离表
前驱关系表

将 A 作为中间顶点的情况有

  • B - A - C [12]
  • B - A - G [7]
  • C - A - G [9]

2.4疑问

如何做到把 A 作为中间顶点的所有情况都进行遍历

中间顶点 k :[A, B, C, D, E, F, G]

出发顶点 i :[A, B, C, D, E, F, G]

终点        j :[A, B, C, D, E, F, G]

k -> i -> j :k 有 7 种选择,i 有 7*7 种选择,j 有 7*7*7 种选择

经过上述三层 for 循环,时间复杂度大大增加,为 n^3

3.弗洛伊德算法的代码实现

3.1创建图并显示距离表与前驱表

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 graph = new Graph(vertex.length, matrix, vertex);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() {for (int k = 0; k < dis.length; k++) {//prefor (int i = 0; i < dis.length; i++) {System.out.print(vertex[pre[k][i]] + " ");}System.out.println();//disfor (int i = 0; i < dis.length; i++) {System.out.print("(" + vertex[k] + "到" + vertex[i] + "的最短路径是" + dis[k][i] + ")" + " ");}System.out.println();System.out.println();}}
}

3.2完整代码

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 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() {for (int k = 0; k < dis.length; k++) {//prefor (int i = 0; i < dis.length; i++) {System.out.print(vertex[pre[k][i]] + " ");}System.out.println();//disfor (int i = 0; i < dis.length; i++) {System.out.printf("(%c到%c的最短路径是%2d) ", vertex[k], vertex[i], dis[k][i]);}System.out.println();System.out.println();}}//弗洛伊德算法public void floyd() {int len = 0;  //变量保存距离//对中间节点遍历,k 就是中间节点的下标 [A, B, C, D, E, F, G]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]) {  //如果中转小于直达dis[i][j] = len;  //更新距离pre[i][j] = pre[k][j];  //更新前驱顶点}}}}}
}

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

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

相关文章

qt笔记之qml中的TextEdit、TextInput、TextArea、TextField的区别

qt笔记之qml中的TextEdit、TextInput、TextArea、TextField的区别 code review! 文章目录 qt笔记之qml中的TextEdit、TextInput、TextArea、TextField的区别一.对比二.C环境中类似功能的控件 一.对比 TextEdit、TextInput、TextArea和TextField都是用于文本输入的组件&#…

硅谷物理服务器有哪些关键优势和特点

硅谷的物理服务器设施全球知名&#xff0c;为各类企业提供了卓越的IT基础设施支持。下面将逐一探讨硅谷物理服务器的关键优势和特点&#xff0c;rak小编为您整理发布硅谷物理服务器有哪些关键优势和特点。 1. 卓越的性能 高性能计算能力&#xff1a;硅谷的物理服务器采用最新一…

内网渗透之icmp隧道传输

原理 # 为什么要建立隧道 在实际的网络中&#xff0c;通常会通过各种边界设备软/硬件防火墙、入侵检测系统来检查对外连接的情况&#xff0c;如果发现异常&#xff0c;会对通信进行阻断。 ​ # 什么是隧道 就是一种绕过端口屏蔽的方式&#xff0c;防火墙两端的数据包通过防火墙…

算法刷题记录 八十五【图论的广度优先搜索理论基础】

前言 图论章节第2篇。 第1篇&#xff1a;记录 八十二【图论理论基础及深度优先搜索算法】&#xff1b; 本文&#xff1a;记录 八十五【图论的广度优先搜索理论基础】 一、广度优先搜索理论基础 广度优先搜索理论基础 参考链接 1.1 知识点框架 1.2 模拟广度搜索的过程 在有向…

YOLT论文精读

引言 很早之前&#xff0c;在本校老师的带领下接触到了目标检测领域。在卫星遥感图像方面有一篇经典的论文《You Only Look Twice: Rapid Multi-Scale Object Detection In Satellite Imagery》。科研小白一开始反复看了几遍也没弄懂&#xff0c;决定写博客来加深自己的理解。…

小米5c解除BL锁刷机root

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 解锁BL锁 1. 下载安装 miflash_unlock&#xff1a;https://miuiver.com/miunlock/&#xff0c;登录小米账号&#xff08;需要和解锁设备绑定的账号一致&#…

进程第二部分

1.任务&#xff1a;子进程做的事情和父进程差不多&#xff08;子承父业&#xff09; 父进程创建出子进程之后&#xff0c;子进程做的事情与父进程完全不同&#xff08;自力更生&#xff09; 2.exec: int exec l(const char *path, const char *arg, ...); int exec v(const c…

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么?

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么&#xff1f; 1、无论指针类型怎么转&#xff0c;类对象内存没有发生任何变化&#xff0c;还是vfptr指向虚函数表&#xff0c;下面是成员变量&#xff0c;这在编译阶段就已经确定好了&#xff1b…

详解国内CRM产品

0. 结论先行 0.1 企业应该建设中台型CRM 0.1.1 CRM产品架构 CRM整个产品架构比较庞大&#xff0c;为了更好地支持所有的业务线&#xff0c;节省开发资源&#xff0c;应该建设一套中台型的CRM系统。 CRM业界常被分为5大模块去支持业务&#xff1a;营销、销售、服务、商务、合…

2024新型数字政府综合解决方案(六)

新型数字政府综合解决方案通过融合人工智能、大数据、区块链和云计算技术&#xff0c;构建了一个全方位智能化的政务平台&#xff0c;旨在提升政府服务的效率、透明度和公众参与度。该方案实现了跨部门的数据互联互通与实时更新&#xff0c;利用先进的数据分析和自动化处理技术…

使用python基于fastapi发布接口(一)

FastAPI官网地址 FastAPI基于Python 3.6+和Starlette框架,天生就带着高性能和异步的基因。 FastAPI的文档生成功能简直是开发者的福音! 你不再需要手动编写API文档,FastAPI能自动帮你搞定。 FastAPI还超级灵活,支持各种数据库和认证方式,无论是SQLite、PostgreSQL还是M…

keepalived讲解及练习

目录 1、keepalived介绍 1.1 keepalived简介 2、高可用集群 2.1 集群类型 2.2 系统可用性 2.3 系统故障 2.4 实现高可用 3、VRRP 3.1 VRRP&#xff1a;Virtual Router Redundancy Protocol 3.2 VRRP 相关术语 3.3 VRRP相关技术 4、 keepalived实验 4.1 全局配置 4…

计算机的错误计算(六十一)

摘要 解释计算机的错误计算&#xff08;六十&#xff09;中的错误计算原因。 计算机的错误计算&#xff08;六十&#xff09;中的计算可以归纳为 因此&#xff0c;我们只需要分析该算式。 例1. 已知 分析如何计算 首先&#xff0c;一个数乘以一个2&#xff0c;一般不会…

替代 SMR 算法!两步孟德尔随机化方法 TWMR 与 revTWMR 整合xQTL+GWAS数据分析基因表达与疾病的关联

全基因组关联研究&#xff08;GWAS&#xff09;是研究大型队列中基因型与表型关系的重要工具。GWAS的已知局限性主要在于从与致病变异相关的连锁不平衡区域中识别生物学机制&#xff0c;而无法直接获得基因层面的表型关联。为了解决这个问题&#xff0c;基于转录组关联研究&…

Python爬虫入门教程(非常详细)适合零基础小白

一、什么是爬虫&#xff1f; 1.简单介绍爬虫 爬虫的全称为网络爬虫&#xff0c;简称爬虫&#xff0c;别名有网络机器人&#xff0c;网络蜘蛛等等。 网络爬虫是一种自动获取网页内容的程序&#xff0c;为搜索引擎提供了重要的数据支撑。搜索引擎通过网络爬虫技术&#xff0c;将…

服务器数据恢复—IBM服务器raid5阵列硬盘出现坏道的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台ibm x3850服务器&#xff0c;有一组由5块硬盘组建的raid5磁盘阵列&#xff0c;上层是Redhat Linux操作系统&#xff0c;部署了一个oracle数据库。 raid5阵列中2块硬盘离线&#xff0c;阵列崩溃。经过检测发现该raid中的热备盘未激…

NC 调整数组顺序使奇数位于偶数前面(一)

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 输入一个长度…

Codeforces Round 966 (Div. 3)(A,B,C,D,E,F)

A. Primary Task 签到 void solve() {string s;cin>>s;bool bltrue;if(s.size()<2)blfalse;else{if(s.substr(0,2)"10"){if(s[2]0)blfalse;else if(s[2]1&&s.size()<3)blfalse; }else blfalse;}if(bl)cout<<"YES\n";else cout…

一套完整的NVR网络硬盘录像机解决方案和NVR程序源码介绍

随着网络技术的发展&#xff0c;视频数据存储的需求激增&#xff0c;促使硬盘录像机&#xff08;DVR&#xff09;逐渐演变为具备网络功能的网络视频录像机&#xff08;NVR&#xff09;。NVR&#xff0c;即网络视频录像机&#xff0c;负责网络视音频信号的接入、存储、转发、解码…

答题情况和每题得分

文章目录 1.提交答题情况1.PracticeDetailController.java2.PracticeDetailService.java3.PracticeDetailServiceImpl.java4.PracticeDetailDao.java5.PracticeDetailDao.xml6.reqSubmitSubjectDetailReq.java 7.dto1.SubjectDetailDTO.java2.SubjectDTO.java3.SubjectOptionDT…