1. 最短路径问题

最短路径问题是生活中经常碰到的一类问题,如机器人路径规划,数学竞赛以及真实的工程施工问题;甚至是我们程序员笔试必刷算法题。其实问题很简单,就是有很多个节点,我们要计算出一个初始点到各个节点的最短距离(或者得到最短路径的表示),如下图,怎么找出A点到其它各个点的最短路径及距离? 人眼扫描得到的结果:A到B、C、D……G距离为 [4, 14, 7, 7, 10, 12],人眼对付7个点还是绰绰有余的,什么?你扫描的结果和我不一样?那咱们还是分析一下原理,然后写个代码来处理一下。

2. Dijkstra算法

2.1 基本原理:有一个数组记录了各个节点到初始节点的距离,该数组初始值是无穷大,然后如果选择A点作为起始点,那么修改数组中A到A的距离为0,并且更新那些与A直接连接的节点值,并把A标记为已访问,接下来,从距离数组中选择距离最小值,也就是B点,循环...

假设我们是要计算其它各点和A点的最短距离。

  1. 我们选取A点作为出发点,那么很明显,我们只可以从和A点有直接联系的B、E点中选择一个最短路径点。先取出距离A点路径长度为4的B点,B点确定,那么我们记录B点以及B点和A的距离为{B(4)}。
  2. 此时我们要从和A有直接关系的E点以及通过B和A有间接关系的C、D点中选择最短路径点;E和D距离A都是7,我们随便取一个,假如选择D点,D点确定,记录D点以及D点和A的距离为{B(4)、D(7)}。
  3. 接下来我们从和A有直接关系的E点以及通过B和A有间接关系的C,通过B、D和A有间接关系的F、G中选择最短路径点;此时E距离A最近为7,E点确定,记录E点以及E点和A的距离为{B(4)、D(7)、E(7)}。
  4. ……

2.2 代码编写

我们大脑很容易分析这种7个点的最短路径,那如果是成百上千个点,错综复杂,我们大脑可能是不够用,通过代码是最有效的解决办法,但代码逻辑也有点难理解,接下来就好好地理解一下。

2.2.1 数据初始化

我们先将图中的各个点以及它们之间的路径距离转化成二维数组,如下图。

2.2.2  结果记录初始化

为了保存结果,我们得对记录结果的数组进行初始化。主要有两个:一个是记录哪些点到A点的距离已经确定下来的数组,另一个是记录每个点到A点的距离。

2.2.3 初始点的选择

我们这里计算各个点到A点的最短距离。

2.2.4 循环计算每个点和A点的距离,更新distance数组以及isVisit数组

2.2.5 运行结果

2.2.6 代码的话,由于变量和数组有点多,所以不太容易理解,而且也不太好分析,所以需要同学们自己耐心对照2.1基本原理理解,因为2.1的思路还是比较简单清晰,理解思路之后,再来理解代码好一些。

3. 完整的Java代码如下

public static void main(String[] args) {int inf = 100;// 初始化节点数为7int node = 7;// 各个点之间的路径长度,inf表示不连通int[][] map = {// 从左往右,从上往下依次表示A、B、C、D、E、F、G{inf, 4,   inf, inf, 7,   inf, inf},{4,   inf, 15,  3,   inf, inf, inf},{inf, 15,  inf, inf, inf, inf, 2  },{inf, 3,   inf, inf, 5,   3,   5  },{7,   inf, inf, 5,   inf, 6,   inf},{inf, inf, inf, 3,   6,   inf, inf},{inf, inf, 2,   5,   inf, inf, inf}};// 记录哪些点已经确定了,确定为true,否则为默认值falseboolean[] isVisit = new boolean[node];// 记录每个点距离初始点的距离int[] distance = new int[node];// 初始值为inf,表示无穷大Arrays.fill(distance, inf);// 选择A作为初始点,0下标代表A,int initNode = 0;// A点到自己的距离为0distance[initNode] = 0;// 同时将isVisit数组元素A的下标0设置为true,表示A点已确定isVisit[initNode] = true;int currNode = initNode;int certainDistance = distance[currNode];// 只需计算其余6个点距离A点的距离,每次循环得到一个点,循环6次即可for (int loop = 1; loop < node; loop++) {// 循环计算和currNode有关系节点的距离,第一次currNode是A点for (int i = 0; i < map[currNode].length; i++) {// 以探索点距初始点的距离加上各点和探索点的距离更新distance矩阵int tmp = certainDistance + map[currNode][i];if(tmp < distance[i]){distance[i] = tmp;}}// 挑选还未访问,并且距离初始点最近的点作为探索点currNode = getMin(distance, isVisit, inf);// 将该探索点标记为true“已访问”,isVisit[currNode] = true;// 并且得到该点和A点的距离certainDistance = distance[currNode];}char[] str = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};for (int i = 0; i < node; i++) {System.out.println(str[i] + "到" + str[initNode] + "的距离为 " + distance[i]);}}static int getMin(int[] dis, boolean[] isVisit, int inf){int min = -1;int minVal = inf;for (int i = 0; i < dis.length; i++) {// 扫描isVisit还未访问的节点,并且该节点是distance矩阵最小的数if((!isVisit[i]) && (dis[i] < minVal)){minVal = dis[i];min = i;}}return min;}

解决最短路径的Dijkstra算法详解,附加Java代码相关推荐

  1. AC自动机算法详解以及Java代码实现

    详细介绍了AC自动机算法详解以及Java代码实现. 文章目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 3.1 案例演示 4 构建fail失配指针 4.1 案例演示 5 匹配文本 5.1 ...

  2. 最短路径问题——Dijkstra算法详解(单源最短路径)

    单源最短路径 单源最短路径,是指从图中任一点出发到其他各点之间的最短路径. Dijkstra算法介绍 Dijkstra算法又称迪杰特斯拉算法,dijkstra算法的核心思想是将全部结点所在集合V分成两 ...

  3. dijkstra 算法_最短路径问题Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  4. 最短路dijkstra算法详解_最短路径问题---Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  5. 最短路径问题 --- Dijkstra算法详解

    最短路径问题 最短路径问题 1.最短路径问题介绍 2.Dijkstra 算法思路 3.Dijkstra算法示例演示 4.Dijkstra算法的代码实现(c++) 参考 最短路径问题 1.最短路径问题介 ...

  6. 最短路径问题 --- Dijkstra算法详解

    最短路径问题 最短路径问题 1.最短路径问题介绍 2.Dijkstra 算法思路 3.Dijkstra算法示例演示 4.Dijkstra算法的代码实现(c++) 参考 最短路径问题 1.最短路径问题介 ...

  7. 最短路径问题---Dijkstra算法详解

    前言 Nobody can go back and start a new beginning,but anyone can start today and make a new ending. Na ...

  8. 最短路径问题---Floyd算法详解

    前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶 ...

  9. Dijkstra算法详解(完美图解、趣学算法)

    Dijkstra算法详解 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 使用优先队列 ...

最新文章

  1. 最短路的那些有趣的模型(不定期更新)
  2. jmeter提取多个变量的多个值_jmeter用一个正则提取器提取多个值的两种方法
  3. 牛客小白月赛6 J 洋灰三角
  4. 专访探真科技:云原生安全与业务迭代平衡术
  5. 8 更新全局变量_2月26日守望先锋版本更新
  6. JavaScript数组的某些操作(一)
  7. vscode推荐插件的安装
  8. google appid申请
  9. PyTorch搭建AlexNet模型(在CIFAR10数据集上准确率达到了85%)
  10. cuda编程(一)基础
  11. QR码与DM码的区别
  12. Oracle 根据汉字返回对应拼音的 函数
  13. 车势科技发力汽车VR,继阿里BUY+之后再现VR购物挑战者
  14. tomcat自动化部署(拉取\备份、部署、更新、回滚)
  15. 计算机桌面图标有双影,win7旗舰版桌面图标出现重影怎么办 win7旗舰版桌面图标没有了如何恢复...
  16. 【养生保健】之日常护理
  17. 如何干净地卸载VMware
  18. LCD显示屏的优势与缺点浅析
  19. 云小朵软件内测分发测试平台说明文档
  20. 微型计算机期末考试a卷,微机原理与接口技术期末试卷A

热门文章

  1. 【MM模块】Releasing Blocked Invoices 释放冻结发票
  2. CSDN添加自定义栏目
  3. SAP财务管控(财务总监背后的管理大师)
  4. 致远今目标移动APP无法脱离PC单独使用
  5. 黄峥为何放手拼多多?数据揭秘电商平台布局背后逻辑
  6. 销量赶超娇兰、SK-II的林清轩,能带领国产护肤品奔赴高端化吗?
  7. list所有元素相加 python_Python基础入门笔记:列表、元组(阿里云天池)
  8. 编写函数,可以接收任意多个整数并输出其中的最大值和所有整数之和。
  9. 网络安全比赛理论答题(二)
  10. CTF(pwn)-格式化字符串漏洞讲解(一)