Dijkstra最短路由算法,求任意两点之间的最短距离【Java】
一、问题
求下图中节点0到节点5之间的最短距离
二、方法
Dijkstra最短路由算法。本文不再赘述,直接上代码,如果不懂,可以参考 文章
三、代码
public class MyDijkstra {public static void main(String[] args) {int[][] nums = {{ 0, 6, 3, -1, -1, -1 }, { 6, 0, 2, 5, -1, -1 }, { 3, 2, 0, 3, 4, -1 }, { -1, 5, 3, 0, 2, 3 }, { -1, -1, 4, 2, 0, 5 }, { -1, -1, -1, 3, 5, 0 }};getShortestPaths(nums, 0, 5);}/*** Dijkstra算法,求任意两点之间的最短路径* * @param nums:二维矩阵,代表两个节点之间的距离,其中-1代表两点之间无法直接相连* @param src:源节点* @param des:目的节点* @return 源节点到目的节点之间的最短距离*/public static int getShortestPaths(int[][] nums, int src, int des) {int[] result = new int[nums.length]; // 用于存放节点src到其它节点的最短距离boolean[] visited = new boolean[nums.length]; // 用于判断节点是否被遍历ArrayList<Integer> path = new ArrayList<Integer>(); // 用于存放(src, des)之间的最短路径// step1:初始化,将src节点设置为已经访问,并且初始化该节点到其他所有节点之间的距离visited[src] = true;path.add(src);for (int i = 0; i < nums.length; i++) {result[i] = nums[src][i];}while (true) {// step2:找到剩余未访问的节点中,距离src最近的一个节点,作为curNodeint curNode = getNearestNode(nums, visited, result);// step3:更新所有节点距离src节点的最短距离(需要考虑curNode)update(nums, curNode, visited, result, path);System.out.println("选择节点 " + curNode + " 更新后的result为:" + Arrays.toString(result));if (curNode == des) {break;}}System.out.println("节点" + src + "到节点" + des + "经过的最短路径是:" + path);System.out.println("节点" + src + "到节点" + des + "之间的最短距离是:" + result[des]);return result[des];}// 找到剩余未访问的节点中,距离源节点最近的一个节点编号public static int getNearestNode(int[][] nums, boolean[] visited, int[] result) {int minIndex = -1;int minLength = Integer.MAX_VALUE;for (int i = 0; i < nums.length; i++) {if (!visited[i] && result[i] != -1 && result[i] < minLength) {minIndex = i;minLength = result[i];}}return minIndex;}// 更新与curNode节点直接相连接的未被访问的节点距离,专业术语叫 “松弛”public static void update(int[][] nums, int curNode, boolean[] visited, int[] result, ArrayList<Integer> path) {visited[curNode] = true;path.add(curNode);for (int j = 0; j < nums.length; j++) {// 节点j未访问过 && 节点curNode与节点j之间需要直接相连if (!visited[j] && nums[curNode][j] != -1) {// 更新result[j]if (result[j] > result[curNode] + nums[curNode][j] || result[j] == -1) {result[j] = result[curNode] + nums[curNode][j];}}}}
}
四、结果
可以看出,节点0到节点5之间经过的最短路径是:0 -> 2 -> 1 -> 3 -> 4 -> 5 ,最短距离是9
五、参考
(1)文章:java实现Dijkstra算法_南 墙-CSDN博客_dijkstra算法java实现
(2)书籍:推荐《啊哈!算法》中关于Dijkstra算法的介绍,通俗易懂
Dijkstra最短路由算法,求任意两点之间的最短距离【Java】相关推荐
- AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_C All Pairs Shortest Path Input ...
- joj 2737 狼与羊的故事 求任意两点之间的必经之路
村长要召开羊族大会,讨论羊族未来的发展,要求羊羊们到指定地点集合.小羊们收到通知后从家里出发到达指定地点.每个羊的家都是与其他羊的家连通的,可以互相访问. 比如说可以从1到3,同样也可以从3到1 .灰 ...
- 使用Floyd-Warshall算法求出两点之间的最短路径
求出下面任意两个点之间的最短路径: 如何才能求出两点之间的最短路径呢?大家都知道学几何的时候,有一条定理就是:两点之间线段最短.但是在实际情况中,我往往两点之间没有之间的通路而是一些曲折的线路. 上面 ...
- Dijkstra算法指定任意两点距离(邻接矩阵法)
Dijkstra算法指定任意两点距离(邻接矩阵法) "最短路算法"编程项目,指定两个结点,计算最短距离并输出该路径 >题目分析: 1.选择Python语言进行算法编程模拟. ...
- C语言入门实战(2):求平面上任意两点之间的距离
这是<C语言入门实战>系列的第2篇. 上一篇:C语言入门实战(1):准备开发环境.快速上手main()函数 下一篇:C语言入门实战(3):秒数转换为时:分:秒 文章目录 题目 提示 参考代 ...
- c语言平曲线坐标,问题描述】给定平面任意两点的坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留两位小数)。...
问题描述]给定平面任意两点的坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留两位小数).要求求距离的运算单独放在一个函数中,然后在main函数中调用..[输入形式]输入两点的坐标(x1,y ...
- 本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。
本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离. 函数接口定义: double dist( double x1, double y1, doub ...
- C语言试题八十四之求空间两点之间的距离
1.题目 定义一个表示三维空间点坐标的结构类型,通过函数求空间上任意两点之间的距离. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科目.帮助C语言学者打好程 ...
- C语言求空间两点之间的距离
定义一个表示三维空间点坐标的结构类型,通过函数求空间上任意两点之间的距离. 算法思想 空间内任意点的坐标有三个,分别为 x 轴方向.y 轴方向.z 轴方向,设定结构体 point,包括三个成员 x.y ...
最新文章
- 梯度下降原理及线性回归代码实现(python/java/c++)
- 定义派生类拷贝构造函数
- Xshell的一些实用技巧
- shell 用环境变量的值修改properties文件
- java8中stream中的任务拆分
- cisco ADSL配置
- vim基础学习之自动补全功能
- 什么是JavaWeb,主要框架有哪些
- Jenkins 升级到2.42 Junit test report 出现错误的解决
- 三维扫描仪[3]——标定·理论
- c++自动抢购_淘宝 2020双十一最新版 全自动做任务软件 超级星秀猫 来了!上车~...
- HDMI设计9--Video Mixer IP
- DOM操作简易年历案例
- 计算机网络教程第五版|微课版 - 第一章 概述 - 重点概念
- window7 安装grldr
- 46-动态编程语言(python)大作业-记忆翻牌游戏
- Java春招和秋招的区别_国企招聘,春招与秋招有何区别?错过秋招我该怎么办?...
- C语言实现每次找出最大最小值排序
- Monkey常见面试问题
- 【转帖】WebRTC回声抵消模块简要分析