最短路径[floyd算法]-----视频讲解+代码实现
求最短路径,一般有三种方法:
单源最短路径--Dijkstra算法
此算法只能求不带负权值的有向无环图
单源最短路径--Bellman-Ford算法(少考)
此算法优点在于:可以求带权值的右向无环图
但只是缺点明显,时间复杂度很高,相当于暴力求解。
多源最短路径--Floyd-Warshall算法
此算法可以解决任意两点间的最短路径,也可以求带负权值的右向无环图。
单源的意思是只能从指定位置开始,求其他位置的最短路径。
多源则不同,可以求任意两点间的最短路径。
本文章主要讲解floyd算法。
floyd算法逻辑:
想要理解floyd算法的实现逻辑,最形象的视频讲解是很有必要的。
这里小编极力推荐B站蓝不过海呀这个Up的视频讲解,讲的非常细节,
比自己去看一些什么算法导论效率要高的多,毕竟相较于文字,
人对图形化的东西更有印象。
B站连接:图-最短路径-Floyd(弗洛伊德)算法
视频中只是对算法的逻辑进行了讲解,但是没有涉及代码的实现,接下来,
我会依照视频讲解逻辑,补充一个JAVA代码的实现方式,文章末尾附带源码。
代码实现:
因为此算法,操作对象是一个图,所以我们先来介绍一下图在JAVA代码中的储存方式:

好了,开始切入正题。
在视频中,运用到了两个矩阵,一个是用来存路径长度的,一个使用来存路径的。
所以我们在定义函数参数时,也要定义两个二维数组:

在视频中,Up主先对这两个矩阵进行了初始化:

D矩阵是放路径长度的(也就是权值)-->这些信息从已经构造好的图里面获取:

而在代码中,就是从这个矩阵获取:

而Path矩阵的初始化,只需要按照D矩阵进行初始化即可。
接下来我们在代码中,去初始化这两个数组:

接下来,需要创建n个中间结点,从0开始,n是顶点的数量,所以定义一个循环:

在这个循环体中,我们要一直执行一下操作:
通过旧的D矩阵,也就是代码中的dist二维数组,创建一个新的矩阵D。
然后依据新的矩阵D,也就是新的dist二维数组,
以及旧的Path矩阵(也就代码中的pPath二维数组)
创建一个新的矩阵Path(也就是新的pPath二维数组)。
循环已结束,那么dist二维数组,存的就是一个顶点到另一个顶点的的总长度了。
pPaht二维数组,就存着具体的路径了。
代码实现:

注意:
已知Path矩阵,求多源最短路径:
每一行的储存思路,和并查集寻找根结点的方式是一样的,最终逆置顶点顺序即可。
算法源码:
/*** 佛洛依德算法* @param pPath 存最短路径* @param dist 放边的长度* */public void floydWarShall(int[][] dist,int[][] pPath){int n=arrayV.length;//获得顶点个数for (int i = 0; i <n ; i++) {Arrays.fill(dist[i],Integer.MAX_VALUE);//路径长度默认初始化成无穷大Arrays.fill(pPath,-1);//路径默认初始化成-1(无效值)}//接下来把matrix中的权重,赋值给dist二维数组,同时更行pPath/*** matrix这个二维数组,储存每一条边的权重* 如果matrix[i][j]==Integer.MAX_VALUE,那么说明i顶点到j顶点没有边*/for (int i = 0; i < n; i++) {for (int j = 0; j <n ; j++) {if(matrix[i][j]!=Integer.MAX_VALUE){//有边进来dist[i][j]=matrix[i][j];pPath[i][j]=i;//记录上一个顶点的下标}}}/* 以上是初始化 */for (int k = 0; k <n ; k++) {//定义中间节点的循环//每次一个中间节点,遍历一次整个二维数组for (int i = 0; i <n ; i++) {for (int j = 0; j <n ; j++) {if(matrix[i][k]!=Integer.MAX_VALUE&&//从i到中间节点 要有边matrix[k][j]!=Integer.MAX_VALUE&&//从中间节点到目标结点j 要有边dist[i][k]+matrix[k][j]<dist[i][j]){//新的路径长度要小于原来的路径长度/*满足以上三个条件,才能更行dist*/dist[i][j]=dist[i][k]+matrix[k][j];//dist更新完,接着更新pPathpPath[i][j]=pPath[k][j];//注意不能pPath[i][j]=k 这也是up强调的,不能直接赋值中间节点//因为如果i->k->j,此时是k//但是 i->t->k k->d->j 这种情况就不是了}}}}}
相关文章:
最短路径[floyd算法]-----视频讲解+代码实现
求最短路径,一般有三种方法: 单源最短路径--Dijkstra算法 此算法只能求不带负权值的有向无环图 单源最短路径--Bellman-Ford算法(少考) 此算法优点在于:可以求带权值的右向无环图 但只是缺点明显,时间复杂度…...
图像/视频恢复和增强CodeFormer
github:https://github.com/sczhou/CodeFormer 尝试增强旧照片/修复人工智能艺术 面部修复 面部色彩增强和恢复 脸部修复...
WPF中ObservableCollection
在WPF(Windows Presentation Foundation)中,ObservableCollection<T> 是一个非常重要的类,它用于实现动态数据绑定功能。这个类位于 System.Collections.ObjectModel 命名空间中,是 ICollection<T>, IList…...
如何用鼠标点击在picturebox的图像上做标记
鼠标点击图像,在点击处画一个圆。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.T…...
k8s介绍
一、前言 Kubernetes(通常简称为 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序,它提供了丰富的功能使得用户能够轻松地管理大规模的容器集群,包括自动化部署和扩展、服务发现和负载均衡、存…...
K-means聚类模型:深入解析与应用指南
K-means聚类是一种广泛使用的无监督学习算法,它通过迭代过程将数据集划分为K个聚类。以下是一篇关于K-means聚类模型的技术文章,将从不同的角度进行详尽的描述。 1. 引言 K-means聚类算法是一种简单且高效的聚类方法,广泛应用于数据挖掘、市…...
CTF-密码学基础
概述 密码学(Cryptolopy):是研究信息系统安全保密的科学 密码学研究的两个方向: 密码编码学(Cryptography):主要研究对信息进行编码,实现对信息的隐蔽密码分析学(Cryptanalytics):主要研究加密信息的破译或消息的伪造…...
代码随想录算法训练营day22 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
654.最大二叉树 和构造二叉树差不多,本题使用索引的方式 class Solution:def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:return self.traversal(nums, 0, len(nums)-1)def traversal(self, nums, left, right):if left > r…...
企业信息防泄漏软件分析:盘点常用企业信息防泄漏软件
在当今数字化时代,企业信息防泄漏软件已成为保障企业数据安全不可或缺的一环。市面上众多的防泄漏软件各具特色,如何从中挑选出最适合自己企业的产品,成为了一个值得深入探讨的话题。 一、企业信息防泄漏软件分析 首先,我们需要…...
Rancher-Kubewarden-保姆级教学-含Demo测试
一、什么是Kubewarden? What is Kubewarden? | Kubewarden 1、就是容器集群的准入策略引擎。 1、使用的策略其实就是k8s原生的security context. 2、使用WebAssembly来编写策略。 1、WebAssembly,可以使用擅长的开发语言来编写策略。(下面的…...
Lumerical Script ------ array 数组类型 和 matrix 矩阵类型
Lumerical Script ------ array 数组类型 和 matrix 矩阵类型 引言正文array 数组类型matrix 矩阵类型引言 这篇仅仅用作个人笔记,因为作者本人比较擅长 Python,每次写 Lumerical Script 总是会写错代码。 正文 array 数组类型 Lumerical Script 脚本有些像 Matlab 脚本,…...
Springboot自动装配源码分析
版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </par…...
Visual Transformer (ViT)模型详解 动图讲解
1 Vit简介 1.1 Vit的由来 ViT是2020年Google团队提出的将Transformer应用在图像分类的模型,虽然不是第一篇将transformer应用在视觉任务的论文,但是因为其模型“简单”且效果好,可扩展性强(scalable,模型越大效果越好),成为了transformer在CV领域应用的里程碑著作,也…...
C++:完美转发(一)(std::forward)
一、理解引用折叠 (一)引用折叠 1. 在C中,“引用的引用”是非法的。像 auto& &rx x;(注意两个&之间有空格)这种直接定义引用的引用是不合法的,但是编译器在通过类型别名或模板参数推导等语境…...
西部首个全域直播基地,打造西部直播基地领军形象
天府锋巢直播产业基地作为西部直播产业的领军者,以其前瞻性的战略布局和卓越的服务体系,正加速推动全域直播的快速发展,助力直播产业实现新升级。该基地作为成都规模最大的直播基地,以加快全域直播为核心目标,通过促进…...
钟表——蓝桥杯十三届2022国赛大学B组真题
问题分析 这个问题的关键有两点:1.怎么计算时针,分针,秒针之间的夹角,2.时针,分针,秒针都是匀速运动的,并非跳跃性的。问题1很好解决看下面的代码就能明白,我们先考虑问题2…...
CSS 之 圆形波浪进度条效果
一、简介 本篇博客讲述了如何实现一个圆形波浪进度条的样式效果,具体效果参考下方GIF图。该样式的加载进度条可以用在页面跳转或数据处理等情况下的加载动画,比起普通的横条进度条来说,样式效果更生动美观。 实现思路: 这…...
按下鼠标进行拖拽,让元素跟随鼠标进行移动,鼠标抬起,元素停止移;js鼠标拖拽 (鼠标按下事件:onmousedown、鼠标移动事件:onmousemove、鼠标抬起事件:onmouseup)
需求如下: 按下鼠标进行拖拽,让元素跟随鼠标进行移动,鼠标抬起,元素停止移动。 解析: 鼠标按下事件:onmousedown 鼠标移动事件:onmousemove 鼠标抬起事件:onmouseup <!DOCT…...
第十二章 项目采购管理
12.1 规划采购管理 12.2 实施采购 12.3 控制采购 项目经理通常没有签订合同的权限,但必须熟悉正规的采购流程; 协议是采购的核心文件,关于协议我们要知道: 协议包括:合同、服务水平协议、谅解、协议备忘录或采购订单 ❗…...
PSFR-GAN复现
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言快速开始安装依赖权重下载及复原 训练网络数据集训练脚本 代码详解训练BaseOptio…...
NotebookLM赋能社科研究(从文献综述到理论建模的闭环实践)
更多请点击: https://intelliparadigm.com 第一章:NotebookLM赋能社科研究(从文献综述到理论建模的闭环实践) NotebookLM 是 Google 推出的面向研究者的 AI 原生笔记工具,其核心能力在于对用户上传的 PDF、TXT 等本地…...
FreeRTOS SMP多核调试踩坑记:在TC397上如何确认你的任务真的跑在了对的CPU核心?
TC397多核调试实战:如何验证FreeRTOS任务真的跑在指定核心? 调试多核系统就像在迷宫中寻找出口——即使代码看起来正确,任务也可能悄悄溜到错误的核心上执行。当LED闪烁频率异常、任务响应延迟或系统出现难以解释的锁死时,开发者首…...
关于光缆,这些事儿通信人一定要知道
随着5G网络的全面铺开和持续深耕,通信工程师的工作边界正在不断拓展。过去,后台网优工程师可能更多地专注于参数调整、信令分析和性能优化;而如今,越来越多的项目要求前后台协同作业,网优人员也需要熟悉现场施工规范&a…...
手势识别技术全解析:从光学、雷达到IoT集成的实战指南
1. 项目概述:从“看见”到“看懂”,手势交互的破局点最近在跟进一个智能家居的集成项目,客户提了个挺有意思的需求:能不能让家里的灯、空调、窗帘,不用说话,也不用找手机,就靠“挥挥手”来控制&…...
哔哩下载姬终极指南:5分钟掌握B站视频批量下载与高清画质处理
哔哩下载姬终极指南:5分钟掌握B站视频批量下载与高清画质处理 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…...
转子永磁式无刷混合励磁电机关键技术【附仿真】
✨ 长期致力于次谐波、无刷调磁、有限元建模与分析、多目标鲁棒优化、弱磁运行研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于次谐波调制与变电流…...
STM32 FSMC/FMC接口详解:地址映射、时序配置与实战优化
1. 项目概述:深入理解STM32的FSMC/FMC接口在嵌入式开发中,尤其是涉及大屏显示、高速数据采集或复杂外部设备交互的项目里,我们常常会遇到一个绕不开的“硬骨头”——如何让STM32单片机高效、稳定地与外部并行存储器或设备通信。这时ÿ…...
OpenPencil Design Orchestrator:打通设计与代码的设计系统自动化工具
1. 项目概述:从开源仓库名到设计编排器的深度解读看到sorrowfulnessstaff973/openpencil-design-orchestrator这个仓库名,很多人的第一反应可能是好奇和困惑。这串字符背后,究竟隐藏着一个怎样的项目?作为一名长期混迹于开源社区、…...
如何彻底移除Windows Defender:13项核心服务完整卸载与系统性能优化终极指南
如何彻底移除Windows Defender:13项核心服务完整卸载与系统性能优化终极指南 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitco…...
ThinkPad风扇控制终极指南:TPFanCtrl2如何让你的笔记本更安静、更凉爽?
ThinkPad风扇控制终极指南:TPFanCtrl2如何让你的笔记本更安静、更凉爽? 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否厌倦了ThinkPad风…...
