一、问题

求下图中节点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】相关推荐

  1. 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 ...

  2. joj 2737 狼与羊的故事 求任意两点之间的必经之路

    村长要召开羊族大会,讨论羊族未来的发展,要求羊羊们到指定地点集合.小羊们收到通知后从家里出发到达指定地点.每个羊的家都是与其他羊的家连通的,可以互相访问. 比如说可以从1到3,同样也可以从3到1 .灰 ...

  3. 使用Floyd-Warshall算法求出两点之间的最短路径

    求出下面任意两个点之间的最短路径: 如何才能求出两点之间的最短路径呢?大家都知道学几何的时候,有一条定理就是:两点之间线段最短.但是在实际情况中,我往往两点之间没有之间的通路而是一些曲折的线路. 上面 ...

  4. Dijkstra算法指定任意两点距离(邻接矩阵法)

    Dijkstra算法指定任意两点距离(邻接矩阵法) "最短路算法"编程项目,指定两个结点,计算最短距离并输出该路径 >题目分析: 1.选择Python语言进行算法编程模拟. ...

  5. C语言入门实战(2):求平面上任意两点之间的距离

    这是<C语言入门实战>系列的第2篇. 上一篇:C语言入门实战(1):准备开发环境.快速上手main()函数 下一篇:C语言入门实战(3):秒数转换为时:分:秒 文章目录 题目 提示 参考代 ...

  6. c语言平曲线坐标,问题描述】给定平面任意两点的坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留两位小数)。...

    问题描述]给定平面任意两点的坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留两位小数).要求求距离的运算单独放在一个函数中,然后在main函数中调用..[输入形式]输入两点的坐标(x1,y ...

  7. 本题要求实现一个函数,对给定平面任意两点坐标(x1​,y1​)和(x2​,y2​),求这两点之间的距离。

    本题要求实现一个函数,对给定平面任意两点坐标(x1​,y1​)和(x2​,y2​),求这两点之间的距离. 函数接口定义: double dist( double x1, double y1, doub ...

  8. C语言试题八十四之求空间两点之间的距离

    1.题目 定义一个表示三维空间点坐标的结构类型,通过函数求空间上任意两点之间的距离. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科目.帮助C语言学者打好程 ...

  9. C语言求空间两点之间的距离

    定义一个表示三维空间点坐标的结构类型,通过函数求空间上任意两点之间的距离. 算法思想 空间内任意点的坐标有三个,分别为 x 轴方向.y 轴方向.z 轴方向,设定结构体 point,包括三个成员 x.y ...

最新文章

  1. 梯度下降原理及线性回归代码实现(python/java/c++)
  2. 定义派生类拷贝构造函数
  3. Xshell的一些实用技巧
  4. shell 用环境变量的值修改properties文件
  5. java8中stream中的任务拆分
  6. cisco ADSL配置
  7. vim基础学习之自动补全功能
  8. 什么是JavaWeb,主要框架有哪些
  9. Jenkins 升级到2.42 Junit test report 出现错误的解决
  10. 三维扫描仪[3]——标定·理论
  11. c++自动抢购_淘宝 2020双十一最新版 全自动做任务软件 超级星秀猫 来了!上车~...
  12. HDMI设计9--Video Mixer IP
  13. DOM操作简易年历案例
  14. 计算机网络教程第五版|微课版 - 第一章 概述 - 重点概念
  15. window7 安装grldr
  16. 46-动态编程语言(python)大作业-记忆翻牌游戏
  17. Java春招和秋招的区别_国企招聘,春招与秋招有何区别?错过秋招我该怎么办?...
  18. C语言实现每次找出最大最小值排序
  19. Monkey常见面试问题
  20. 【转帖】WebRTC回声抵消模块简要分析

热门文章

  1. vue css 拖拽,vue----拖拽小方块
  2. 《新型智慧城市总体规划导则》发布
  3. Apple watch 心率监测的原理是什么
  4. IT从业者考证最高补贴30000元,持NISP二级/CISP证书可申请
  5. 电脑之间快速传输超大文件(100GB以上)的方法
  6. 01-使用EasyExcel读取和写入Excel文件
  7. 【转】U-Boot启动过程--详细版的完全分析
  8. Android的notification通知
  9. 架构基本概念和架构本质
  10. android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)