在解决单源点最短路径的问题时,常常用到经典的Dijkstra算法,其算法的本质思想是: 按路径长度递增依次产生最短路径

下面给出算法的大致流程:

1.初始化所有结点并将起始点设为标记,进入以下循环

2.在到达某点的最短路径中找最小且未标记的点(可以用一维数组表示)

如:

数组下标:0  1   2   3   4   5

Len      :-   0   5  10  2   -

这个数组表示 1号节点为初始节点,1号节点到达2号节点的最短路径为5,到3号为10,无法到达5号(具体可以以较大的数表示其路径)。

从中找到一个未标记且Len最短的一个,未标记用另一数组记录

如:

数组下标:0   1   2   3   4   5

标记     :0   1   0   0   1   0

此数组表示从初始节点到达4号节点的最短路径已找到

从以上两个数组中可以得出:此次循环找到的点为2号节点,进入下一步

3.标记找到的点,以此标记点为中间点重新计算所有未标记点的最短路径(更新最短路径表)

4.循环1.2步至n-1次(n为顶点数,若最后还有未被标记的,说明无法到达此点)



[cpp] view plaincopy
  1. while(count<n)
  2. {
  3. tempmin=INFINITE;
  4. for(i=1;i<=n;i++)
  5. {
  6. if(in[i]==0&&Len[i]<tempmin) //find the smallest one
  7. {
  8. tempmin=Len[i];
  9. si=i;
  10. }
  11. }
  12. in[si]=1;
  13. count++;
  14. for(i=1;i<=n;i++) //updata the length
  15. {
  16. if(in[i]==0&&(tempmin+mGraph.matrix[si][i])<Len[i])
  17. {
  18. Len[i]=tempmin+mGraph.matrix[si][i];
  19. }
  20. }
  21. }
核心部分是上面的两个for循环,第一个for循环遍历所有结点,找到未标记并且长度最短的路径;第二个for循环也是遍历所有结点以上面找到的最短路径结点为中间点更新最短路径表;注意在第一个for循环之后要标记找到的点(说明到达此点的最短路径已找到)

下面用一个实例来具体说明:


V0-V5 共6个节点,节点间路径已标出,现要求从V0到其余各节点的最短路径;

有上面的算法流程可知,在使用Dijkstra算法时需要几个结构来保存我们想要的信息:

1.保存这张图的结构体

2.记录V0到其余各节点最短路径的数组(这里设为Len[n+1])

3.记录某节点是否已找到最短路径的数组(这里设为in[n+1])

接下来就是算法实现部分:

1.标记V0 -- in[1]=1   初始化 Len[]={INFINITE , 0 , INFINITE , 10, INFINITE , 30 , 100}  这里数组首元素未用到,数组下标从1开始表示V0以此类推

2.第一次循环与V0相邻的有V2、V4、V5,其中V2距离最短为10,标记V2,并且以V2为中间点(路径为V0->V2->Vx)更新最短路表,此时V3被更新为10+50=60,。

3.进入第二次循环,此时未被标记的有V1、V3、V4、V5,,其中从V0到这些的临时最短路分别为INFINITE、60、30、100,从中找到最小的即V4,将V4标记为1,以V4为中间点(路径为V0->V4->Vx)更新最短路表,此时V3被更新为50,V5被更新为90。

4.进入第三次循环,此时未被标记的有V1、V3、V5,其中临时最短路分别为INFINITE、50、90,从中找到最小的即V3,将V3标记为1,以V3为中间点(路径为V0->V4->V3->Vx)更新最短路表,此时V5被更新成60。

5.进入第四次循环,此时未被标记的有V1、V5,其中临时最短路分别为INFINITE、60,找到V5,标记为1,以V5为中间点更新最短路表,此时没有元素被更新

6.进入第五次循环,这次循环没找到任何东西

7.退出循环,Len表中即为V0到其余各个节点的最短路径。

以上就是Dijkstra算法最基本的思想,当然,在找最短路时我们常常会需要求出到达某点的最短路径,那么下面,我们就来看看要怎样记录下到达某点的最短路径:

在Dijkstra算法的前提下加入查询最短路径其实很简单,只要在每次更新最短路时保存在该顶点的父节点序号即可,最后输出时回退中间节点然后用堆栈输出即可

Dijkstra算法详解:相关推荐

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

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

  2. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  3. 迪杰斯特拉(Dijkstra)算法详解

    迪杰斯特拉(Dijkstra)算法详解 在讲解迪杰斯特拉算法之前先讲解一下什么是最短路径: [图一] 假如我要求从A点到D点的最短路径,我们用肉眼可以很快速找出A–>C–>E–>D就 ...

  4. dijkstra算法详解—简单易懂

    文章目录 1 简介 2 算法思想与原理 3 具体步骤 4 动态展示 5 代码实现(以邻接矩阵为例) 5.1 基本数据 5.2 初始化 5.3 dijkstra算法核心 5.4 主函数与头文件等 6 拓 ...

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

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

  6. 解决最短路径的Dijkstra算法详解,附加Java代码

    1. 最短路径问题 最短路径问题是生活中经常碰到的一类问题,如机器人路径规划,数学竞赛以及真实的工程施工问题:甚至是我们程序员笔试必刷算法题.其实问题很简单,就是有很多个节点,我们要计算出一个初始点到 ...

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

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

  8. 最短路径问题:Dijkstra算法详解

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

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

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

  10. 最短路dijkstra算法详解_图论系列开始填坑--Dijkstra,单源最短路

    暑假只有最开始的几天最有意思,考完试玩了几天就感觉到了无聊.抱着想要出去走走的心态,我制定了一个出行路线图,我在1号城市,想去看一看2,3,4,5号城市(每去一个城市都从1号城市出发),一切准备就绪, ...

最新文章

  1. Java平均工资再次上涨!这份宝藏资料限量免费送!
  2. php微信回复乱码,php版微信公众平台回复中文出现乱码问题的解决方法
  3. 简历石沉大海、面试被刷?拒绝你的HR小姐姐,可能只是个AI
  4. python自动化开发_python自动化开发-2
  5. codeforces 96A-C语言解题报告
  6. 数据结构与算法分析(六)——C++实现二叉查找树
  7. mssql 不能连接mysql,ASP连接MSSQL的错误:拒绝访问_MySQL
  8. 补:关于man关于SEE ALSO(参见)中代号与vim下常用命令
  9. python find函数原理_Opencv findcontours函数原理,以及python numpy实现
  10. c语言printf的-是什么意思,c语言printf是什么意思
  11. 奇异值分解(SVD)(2)
  12. 邀请码:20111221235047_092555,有效期至2011-12-21 23:50:45
  13. Unity3d开发MOBA游戏类《王者荣耀》记录(一)
  14. declare 简单用法
  15. 什么是大小端?如何判断大小端
  16. 1. vue.js的快速入门使用
  17. Pwn2Own 2022 温哥华大赛Master of Pwn 诞生
  18. 中国煤制油市场产能需求与发展策略规划报告2022版
  19. A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection(翻译)
  20. 下一代LMS的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. MSDN官方数据库开发群
  2. Django auth认证
  3. [原创]SpringBoot上传图片踩的坑
  4. RandomCodeUtil随机数工具类,随机生成数字、字母、数字字母组合、中文姓名
  5. IOS开发中的几种设计模式介绍
  6. 全文索引--海量数据模糊查询
  7. 处理日期和时间数据--字符串文字
  8. Splash 简介与安装
  9. nginx 服务器并发优化
  10. PHP中require(),include(),require_once()和include_once()有什么区别