最短路径[dijkstra算法]——视频讲解+JAVA实现

dijkstra算法逻辑:

想要理解floyd算法的实现逻辑,最形象的视频讲解是很有必要的。

这里小编极力推荐B站蓝不过海呀这个Up的视频讲解,讲的非常细节,

比自己去看一些什么算法导论效率要高的多,毕竟相较于文字,

人对图形化的东西更有印象。

B站连接:【图-最短路径-Dijkstra(迪杰斯特拉)算法】

视频中只是对算法的逻辑进行了讲解,但是没有涉及代码的实现,接下来,

我会依照视频讲解逻辑补充一个JAVA代码的实现方式,文章末尾附带源码。

代码实现:

视频中是基于这样一个表格进行算法实现的:

如果放在代码里,可以抽离出三个数组来进行管理:

如下我们就来具体实现一下这个算法:

首先初始化所有数组:

初始化完毕,就可以遍历下面这个表了,要遍历n次,n是总节点数,从第一列开始遍历:

所以我们要建立一个for循环:

每一列的遍历(每一次循环),我们都要去找当前到那个节点路径长度是最短的,接下来寻找当前还没有确定的顶点中,谁最短:

接下来,通过最小顶点indexMin,去寻找其周围的最短路径:

到了这里,此算法就已经实现了,只需要循环更新n列即可。


源码:

  /*** 迪杰斯特拉算法,求最短路径* 缺点:不能是负权值** @param vSrc  给定始顶点* @param dist  储存顶点的路径长度* @param pPath 储存路径,按照并查集的逻辑*              <p>*              事先说明我自己定义的图的储存方式:*              char[] ArrayV;//用来存顶点的*              int[][] matrix;//用来存对应边的权重的*              (了解即可,我们主要聚焦算法的实现)*/public void dijkstra(char vSrc, int[] dist, int[] pPath) {int n = arrayV.length;//获得节点的长度boolean[] visited = new boolean[n];//用于标记,visited[i]是否已经确定最短路径,默认为falseArrays.fill(dist, Integer.MAX_VALUE);//先把存距离的数组初始化成最大值Arrays.fill(pPath, -1);//路径初始化为无效值-1(因为路径数组存的都是上一个顶点的下标嘛)int index = getIndexOfV(vSrc);//此方法可以获得,vSrc在ArrayV数组对应的下标dist[index] = 0;//自己到自己的距离就是0//        pPath[index]=0;//这里起始位置对应下标可以设置也可以不设置,不影响最总结果for (int k = 0; k < n; k++) {//对表遍历n列int min=Integer.MAX_VALUE;//把最小值定义成最大值int indexMin=0;//这个下标用来指向最小值,默认为0for (int i = 0; i <n ; i++) {if(visited[i]==false&&//没有被确定的顶点dist[i]<min ){//要找最小的顶点min=dist[i];//更新最小值indexMin=i;//更新下标}}//程序执行到这个,已经找到当前列,中路径最小的顶点visited[indexMin]=true;//可以直接确定从起始顶点,到这个顶点的最短路径已经找到/*** matrix储存每条边的权重* matrix[i][j]==最大值---说明没有边* */for (int i = 0; i <n ; i++) {if(matrix[indexMin][i]!=Integer.MAX_VALUE&&//必须有边visited[i]==false&&//必须是没有确定最短路径的顶点dist[indexMin]+matrix[indexMin][i]<dist[i]){//新的路径必须小于久的路径,才更新最短路径dist[i]=dist[indexMin]+matrix[indexMin][i];//更行长度pPath[i]=indexMin;//更新路径,指向上一个节点indexMin}}}}

测试如下这个图:

执行结果:

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

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

相关文章

vue 发布项目

You are not allowed to force push code to a protected branch on this project. 分支做了保护&#xff0c;git中设置允许强制推送

第十二讲:指针(4)

第十二讲&#xff1a;指针&#xff08;4&#xff09; 1.回调函数1.1什么是回调函数1.2深入理解并使用回调函数1.2.1简单写法1.2.2优化 2.qsort函数详解2.1函数简单介绍2.3qsort函数使用举例2.3.1qsort函数排序整形数据2.3.2qsort函数排序结构数据 3.qsort函数的模拟实现3.1冒泡…

2024最新软件测试面试题及答案【史上最全】

以下是软件测试相关的面试题及答案&#xff0c;欢迎大家参考! 1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&…

渗透测试工具--AppInfoScanner 的安装与使用(一)

简洁 ApplicationScanner是一个快速稳定的App代码扫描工具&#xff0c;其主要功能是对ipa和apk文件进行扫描&#xff0c;以快速发现存在风险的代码。这款工具基于Python 3.7实现其主要功能&#xff0c;同时apk检测部分需要JDK 11的支持&#xff0c;因此它具备较好的跨平台特性…

Stable Diffusion WebUI 绘画

配置环境介绍​ 目前平台集成了 Stable Diffusion WebUI 的官方镜像&#xff0c;该镜像中整合如下资源&#xff1a; GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本&#xff1a;v1.7.0 Python版本&#xff1a;3.1…

娱乐营销的新玩法:Kompas.ai如何让内容更加趣味化

在数字化时代&#xff0c;内容营销已成为品牌与消费者沟通的重要桥梁。然而&#xff0c;随着信息的爆炸式增长&#xff0c;用户的注意力越来越分散&#xff0c;传统的营销方式已经难以吸引用户的兴趣。在这种背景下&#xff0c;娱乐营销应运而生&#xff0c;它通过将娱乐元素融…

忍痛分享一个标签页插件

如果你想要一个自定义收藏页面的标签页插件&#xff0c;他没有广告&#xff0c;而且支持很多插件&#xff0c;如股票、时间、倒计时、备忘录&#xff0c;那么我必须推荐你一个插件了。 itab 标签页。 标签页可以分组&#xff0c;可以自定义图标&#xff0c;很多都能自动识别 l…

VS2019正确的安装Eigen库,解决所有报错(全网最详细!!)-转

1.下载库 1.第一种方法 官方链接&#xff1a; http://eigen.tuxfamily.org/index.php?titleMain_Page https://gitlab.com/libeigen/eigen/-/releases 选择后面三个文件中的zip下载&#xff0c;解压得到 2.第二种方法 百度云链接&#xff1a;https://pan.baidu.com/s/16…

SpringBoot整合Swagger,让开发更遍历

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ SpringBoot整合Swagger&#xff0c;让开发更遍…

鸿蒙 DevEcoStudio:用户名密码获取保存

【使用首选项实现用户名密码保存获取】 打开src/main/ets/entryability路径下的EntryAbility.ts文件 在 export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, testTag, %{public}s, Ability onCreate);下边添加内容&…

车牌检测识别功能实现(pyqt)

在本专题前面相关博客中已经讲述了 pyqt + yolo + lprnet 实现的车牌检测识别功能。带qt界面的。 本博文将结合前面训练好的模型来实现车牌的检测与识别。并用pyqt实现界面。最终通过检测车牌检测识别功能。 1)、通过pyqt5设计界面 ui文件如下: <?xml version="1…

分享5个免费AI写作软件

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度渗透到我们生活的方方面面&#xff0c;而写作领域也不例外。AI写作工具的出现&#xff0c;不仅改变了传统的写作流程&#xff0c;更在创意表达、文本生成、语言校正等方面展现了其独特的优势。这些工…