Dijkstra算法详解:
在解决单源点最短路径的问题时,常常用到经典的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为顶点数,若最后还有未被标记的,说明无法到达此点)
- while(count<n)
- {
- tempmin=INFINITE;
- for(i=1;i<=n;i++)
- {
- if(in[i]==0&&Len[i]<tempmin) //find the smallest one
- {
- tempmin=Len[i];
- si=i;
- }
- }
- in[si]=1;
- count++;
- for(i=1;i<=n;i++) //updata the length
- {
- if(in[i]==0&&(tempmin+mGraph.matrix[si][i])<Len[i])
- {
- Len[i]=tempmin+mGraph.matrix[si][i];
- }
- }
- }
下面用一个实例来具体说明:
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算法详解:相关推荐
- Dijkstra算法详解(完美图解、趣学算法)
Dijkstra算法详解 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 使用优先队列 ...
- 图论-最短路Dijkstra算法详解超详 有图解
整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...
- 迪杰斯特拉(Dijkstra)算法详解
迪杰斯特拉(Dijkstra)算法详解 在讲解迪杰斯特拉算法之前先讲解一下什么是最短路径: [图一] 假如我要求从A点到D点的最短路径,我们用肉眼可以很快速找出A–>C–>E–>D就 ...
- dijkstra算法详解—简单易懂
文章目录 1 简介 2 算法思想与原理 3 具体步骤 4 动态展示 5 代码实现(以邻接矩阵为例) 5.1 基本数据 5.2 初始化 5.3 dijkstra算法核心 5.4 主函数与头文件等 6 拓 ...
- dijkstra 算法_最短路径问题Dijkstra算法详解
1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...
- 解决最短路径的Dijkstra算法详解,附加Java代码
1. 最短路径问题 最短路径问题是生活中经常碰到的一类问题,如机器人路径规划,数学竞赛以及真实的工程施工问题:甚至是我们程序员笔试必刷算法题.其实问题很简单,就是有很多个节点,我们要计算出一个初始点到 ...
- 最短路径问题 --- Dijkstra算法详解
最短路径问题 最短路径问题 1.最短路径问题介绍 2.Dijkstra 算法思路 3.Dijkstra算法示例演示 4.Dijkstra算法的代码实现(c++) 参考 最短路径问题 1.最短路径问题介 ...
- 最短路径问题:Dijkstra算法详解
前言 Nobody can go back and start a new beginning,but anyone can start today and make a new ending. ...
- 最短路dijkstra算法详解_最短路径问题---Dijkstra算法详解
1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...
- 最短路dijkstra算法详解_图论系列开始填坑--Dijkstra,单源最短路
暑假只有最开始的几天最有意思,考完试玩了几天就感觉到了无聊.抱着想要出去走走的心态,我制定了一个出行路线图,我在1号城市,想去看一看2,3,4,5号城市(每去一个城市都从1号城市出发),一切准备就绪, ...
最新文章
- Java平均工资再次上涨!这份宝藏资料限量免费送!
- php微信回复乱码,php版微信公众平台回复中文出现乱码问题的解决方法
- 简历石沉大海、面试被刷?拒绝你的HR小姐姐,可能只是个AI
- python自动化开发_python自动化开发-2
- codeforces 96A-C语言解题报告
- 数据结构与算法分析(六)——C++实现二叉查找树
- mssql 不能连接mysql,ASP连接MSSQL的错误:拒绝访问_MySQL
- 补:关于man关于SEE ALSO(参见)中代号与vim下常用命令
- python find函数原理_Opencv findcontours函数原理,以及python numpy实现
- c语言printf的-是什么意思,c语言printf是什么意思
- 奇异值分解(SVD)(2)
- 邀请码:20111221235047_092555,有效期至2011-12-21 23:50:45
- Unity3d开发MOBA游戏类《王者荣耀》记录(一)
- declare 简单用法
- 什么是大小端?如何判断大小端
- 1. vue.js的快速入门使用
- Pwn2Own 2022 温哥华大赛Master of Pwn 诞生
- 中国煤制油市场产能需求与发展策略规划报告2022版
- A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection(翻译)
- 下一代LMS的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
热门文章
- MSDN官方数据库开发群
- Django auth认证
- [原创]SpringBoot上传图片踩的坑
- RandomCodeUtil随机数工具类,随机生成数字、字母、数字字母组合、中文姓名
- IOS开发中的几种设计模式介绍
- 全文索引--海量数据模糊查询
- 处理日期和时间数据--字符串文字
- Splash 简介与安装
- nginx 服务器并发优化
- PHP中require(),include(),require_once()和include_once()有什么区别