单源最短路径Dijkstra算法的思想、详细步骤、代码
目录
一、算法思想
二、算法详细步骤
三、伪代码 + C++代码
四、算法复杂度分析
五、算法改进
六、应用案例
一、算法思想
1、Dijkstra 算法是用来求解单源最短路径问题的经典算法,其本质上是一个贪心算法。
(PS: 求任意两个结点之间最短路径的有 Floyd 算法)
2、算法的基本思想是:设置一个顶点集合 S 并不断地做贪心选择来扩充这个集合。
3、该算法适用:1)边权为正,2)有向无向都适用。
有一些相关的性质:
- 对于边权为正的图,任意两个结点之间的最短路,不会经过重复的结点。
- 对于边权为正的图,任意两个结点之间的最短路,不会经过重复的边。
- 对于边权为正的图,任意两个结点之间的最短路,任意一条的结点数不会超过 n ,边数不会超过 n - 1 。
二、算法详细步骤
假设:
1)已知带权图 G = (V, E)
- V: 顶点(Vertex)的集合
- E: 边(Edge)的集合
- 边 e = (u, v), u V, v V
2)一个顶点属于S当且仅当从源到该顶点的最短路径长度已知。
3) 数据结构:数组d,为记录当前每个顶点所对应的最短特殊路径长度(源v0到该顶点)。
算法步骤:
1、S 中初始时仅包含源 v0
2、从顶点集合 { V - S } 中选取最短特殊路径长度最短的顶点,并将其加入 S
3、对数组 d 进行更新(更新条件:若源 v0 通过某个顶点到该顶点的路径比原先 d 数组保存的小)
三、伪代码 + C++代码
1、伪代码
清除所有点的标号 // 属于集合S的标记
设d[0] = 0, 其他d[i] = INF // initial
循环n次 {在所有未标号结点中,选出d值最小的结点x // 从{V - S}中选出从源出发距离最短的顶点给结点x标记 // 加入集合S对于从x出发的所有边(x,y),更新d[y] = min{d[y], d[y]+w(x, y)} // 更新所有x的出边顶点
}
2、C++代码实现
memset(v, 0, sizeof(v));
for(int i = 0; i < n; i++) d[i] = (i==0 ? 0 : INF);
for(int i = 0; i < n; i++) {int x, m = INF;for(int y = 0; y < n; y++) if(!v[y] && d[y]<=m) m = d[x=y];v[x] = 1;for(int y = 0; y < n; y++) d[y] = min(d[y], d[x] + w[x][y]);
}
四、算法复杂度分析
五、算法改进
六、应用案例
更新:2021年5月3日
未完,待续。。。
单源最短路径Dijkstra算法的思想、详细步骤、代码相关推荐
- 分支限界法:单源最短路径--dijkstra算法
单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...
- 数据结构与算法—单源最短路径dijkstra算法
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法
一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...
- dijkstra 算法_数据结构与算法—单源最短路径dijkstra算法
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- 单源最短路径dijkstra算法
介绍 dijkstra算法也是解决单源最短路径问题的一种方法.它要求图中路径都是非负的.而且,它的效率要高于bellman算法. 实现 首先定义图的结点信息和边信息. struct _Node;typ ...
- 单源顶点最短路径java_单源最短路径-Dijkstra 算法
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问题:求a点到各个点的最短距离,如下图 ...
- 单源最短路径---Dijkstra算法
有这样一道题:在一个图(如图所示)中,一共有四个点:1 2 3 4 这四个点之间各有相连,且每条边都有自己的权值.现在小明在点1上, 他想要到3去,请问最短路径是多少. 很容易得到该图的邻接矩阵.我们 ...
- 单源最短路径Dijkstra算法升级:出现多条最短路径,输出之?
文章目录 引言:单条路径的标配算法 进阶:记录多条路径的改进版Dijkstra算法: 1. 对`P[]`数组进行扩充 2. 求最短路径条数 3. 输出所有最短路径 引言:单条路径的标配算法 一个普通. ...
- 单源最短路径(Dijkstra算法)
题目:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=208 #include <iostream> #incl ...
最新文章
- 结构型模式之Bridge模式
- CloudStack各版本新特性
- 微软热门知识点之------c#3.0新特性【转】
- 利用TortoiseSVN获取最新版本的OpenCV源码
- 对软件体系结构的认识
- oracle查询使用or,查询视图,使用or就用不上索引
- java web js加版本号_[Java教程]js 比较版本号(一)
- 隐马尔科夫模型(Hidden Markov Models) 系列之三
- 汉诺塔(三) 判断操作是否合法 + 栈(stack)数组
- Mac 显示sudo: pip: command not found
- web开发python 人工智能_【图片】python可以做什么———Web开发,数据分析,人工智能和脚本开发【python学习吧】_百度贴吧...
- CentOS7通过yum安装Openresty
- eval同时绑定两个值:通过String.Format给超链接中的两个参数赋值
- kotori和糖果(OEIS)
- 写给本命年24岁的自己和你:这一年决定你的未来
- 呕心沥血之飞冰(icejs)项目使用vue组件 -- vuera
- 你的电脑/设备需要恢复 错误码0xc000014c
- 【20200129】win10 win7双系统安装成功后,win7提示未激活怎么办?
- A. Binary Decimal acii码 字符 数字的转换 vector容器 sort 排序
- JavaScript对象与JSON格式的转换