Dijkstra是一种求单源点最短路径的算法,即求某一个顶点到其余各顶点之间的最短路径,下面采用邻接矩阵来存储图中信息

算法思路为:

1,假设v0是源点,s是已求得最短路径的终点集合,用D[i]来保存从v0到vi顶点之间的最短路径。初始:将v0置于集合s之中,
2,初始化D[i]为v0到vi之间的权值。a,求从v0出发长度最短的路径,通过计算D[j]=min{D[i]|vi不属于s},找到j顶点,将j顶点加入s集合。b,求下一条最短路径,因为有新的结点加入到s集合中,所以需要修改从v0到其余不属于s的顶点之间的D[i]上的值。即若D[j]+arcs[j][k]<D[k](k不属于s中),修改D[k]值为D[j]+arcs[j][k]
3,重复2中的a,b步骤

示例如下


按照上面思路列出每一次循环的结果列表如下:

第一次 第二次 第三次 第四次 第五次
v1
v2 10 (v0,v2) \ \ \ \
v3 60 (v0,v2,v3) 50 (v0,v4,v3) \ \
v4 30 (v0,v4) 30 (v0,v4) \ \ \
v5 100 (vo,v5) 100 (vo,v5) 90 (v0,v4,v5) 60 (vo,v4,v3,v5 \
vj v2 v4 v3 v5 \
s {vo,v2} {vo,v2,v4} {vo,v2,v4,v3} {vo,v2,v4,v3,v5}
辅助结构
bool final[maxSize];//表示集合s
final[i] = true;//顶点i在s中
final[i] = false;//i不在s中
bool p[maxSize][maxSize];//表示路径,
p[v][w] = true;//表示w顶点属于从源点到v顶点最短路径上的一个顶点
p[v][w] = false;//表示w顶点不属于从源点到v顶点最短路径上的一个顶点
int D[maxSize];//表示从源点到各个顶点之间最短路径长度
Dijkstra算法
void dijkstra(mGraph& G, int v0)
{int i, j, minValue, min;//初始化for (i = 0; i < G.vexnum; ++i){final[i] = false;D[i] = G.arc[v0][i];for (j = 0; j < G.vexnum; ++j)p[v0][j] = false;if (G.arc[v0][i] < infini){p[i][v0] = true;p[i][i] = true;}}final[v0] = true;//v0入集合D[v0] = 0;for (i = 1; i < G.vexnum; ++i)//循环G.vexnum-1次{//找到最小的D[i]minValue = infini;for (j = 0; j < G.vexnum; ++j){if (final[j]==false)if (minValue>D[j]){minValue = D[j];min = j;}}final[min] = true;//更新for (j = 0; j < G.vexnum; ++j){if (final[j] == false && minValue + G.arc[min][j] < D[j])//若G.arc[min][j]为INT_MAX,左边相加则会溢出,所以不能使用INT_MAX{//更新DD[j] = minValue + G.arc[min][j];//更新pfor (int temp = 0; temp < G.vexnum; ++temp)p[j][temp] = p[min][temp];p[j][j] = true;}}}
}
完整示例
#include<iostream>
#define infini INT_MAX/2//最大值不选取INT_MAX,防止溢出
#define maxSize 6//顶点数目
#define MAX 8//边的个数
//邻接矩阵
typedef struct
{int vexnum, arcnum;//顶点数和边数char vex[maxSize];//顶点信息(字符)int arc[maxSize][maxSize];//二维数组(存储边上的信息)
}mGraph;bool final[maxSize];//表示集合s
bool p[maxSize][maxSize];//表示路径
int D[maxSize];//表示从源点到各个顶点之间最短路径长度void dijkstra(mGraph& G, int v0);//求最短路径
int main()
{using namespace std;mGraph G;//邻接矩阵存储图并进行初始化G.vexnum = maxSize;G.arcnum = MAX;char vexData[maxSize] = { 'a', 'b', 'c', 'd', 'e','f' };//顶点信息int arcData[MAX][3] = { { 0, 2 ,10}, { 0, 5,100 }, { 0, 4 ,30}, { 1, 2,5 }, { 2, 3 ,50},{ 3, 5, 10 }, { 4, 3, 20 }, { 4, 5, 60 } };//连接的边int i, j;for (i = 0; i < G.vexnum; ++i){G.vex[i] = vexData[i];for (j = 0; j < G.vexnum; j++)G.arc[i][j] = infini;}for (i = 0; i < G.arcnum; i++)G.arc[arcData[i][0]][arcData[i][1]] = arcData[i][2];//初始化完毕cout << "求从v0顶点出发的最短路径: ";cout << endl;dijkstra(G, 0);for (i = 1; i < G.vexnum; ++i){if (D[i] == infini){cout << "不存在到v" << i<< "的路径" << endl;continue;}cout << "到v" << i << ": 长度为" << D[i] << ' '<< "最短路径上的顶点为";for (j = 0; j < G.vexnum; ++j)if (p[i][j] == true)cout << 'v' << j << ' ';cout << endl;}cout << endl;return 0;
}
void dijkstra(mGraph& G, int v0)
{int i, j, minValue, min;//初始化for (i = 0; i < G.vexnum; ++i){final[i] = false;D[i] = G.arc[v0][i];for (j = 0; j < G.vexnum; ++j)p[v0][j] = false;if (G.arc[v0][i] < infini){p[i][v0] = true;p[i][i] = true;}}final[v0] = true;//v0入集合D[v0] = 0;for (i = 1; i < G.vexnum; ++i)//循环G.vexnum-1次{//找到最小的D[i]minValue = infini;for (j = 0; j < G.vexnum; ++j){if (final[j]==false)if (minValue>D[j]){minValue = D[j];min = j;}}final[min] = true;//更新for (j = 0; j < G.vexnum; ++j){if (final[j] == false && minValue + G.arc[min][j] < D[j])//若G.arc[min][j]为INT_MAX,左边相加则会溢出,所以不能使用INT_MAX{//更新DD[j] = minValue + G.arc[min][j];//更新pfor (int temp = 0; temp < G.vexnum; ++temp)p[j][temp] = p[min][temp];p[j][j] = true;}}}
}

输出结果为下图:

Floyd算法求最短路径:
https://blog.csdn.net/Little_ant_/article/details/104293812
附:如果采用上面链接博文中的Floyd算法求上图的最短路径,结果如下:

(ps:希望大家可以多多点赞

最短路径(Dijkstra算法)(c/c++)相关推荐

  1. 最短路径-Dijkstra算法与Floyd算法

    最短路径-Dijkstra算法与Floyd算法 原文:https://www.cnblogs.com/smile233/p/8303673.html 一.最短路径 ①在非网图中,最短路径是指两顶点之间 ...

  2. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

  3. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  4. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  5. 使用邻接矩阵实现有向图最短路径Dijkstra算法

    题目描述: 用邻接矩阵存储有向图,实现最短路径Dijkstra算法,图中边的权值为整型,顶点个数少于10个. 输入描述 首先输入图中顶点个数和边的条数: 再输入顶点的信息(字符型): 再输入各边及其权 ...

  6. 最短路径——Dijkstra算法与Floyd算法

    最短路径 Dijkstra算法 C语言代码实现 代码解析 Floyd算法 算法解析 C语言代码实现 最短路径问题 最短路径问题是我们经常会面临的一种决策问题.在图论中,非网图(边没有权值)的最短路径就 ...

  7. 数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  8. C++ 实现带权有向图的单源点最短路径Dijkstra算法(完整代码)

    首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v0到每个终点vi的最短路径的长度. 它的初态为:若从v0到vi有弧,则D[i]为弧上的权值:否则,置D[i]为∞. 显然,长度为 ...

  9. 最短路径——Dijkstra算法HDU Today(hdu2112)

    关于本题的floyd解法:http://blog.csdn.net/sm9sun/article/details/53282826 上篇博文介绍了floyd解决最短路径的方法,然而由于floyd极大的 ...

最新文章

  1. 2021年大数据Hive(一):​​​​​​​Hive基本概念
  2. linux 文件服务,Linux操作系统之文件服务(ftp、nfs)
  3. ReflectionLabel(倒影控件)
  4. 重温JSP学习笔记--El表达式
  5. c语言 if 按大小顺序排序,刚学c语言,老师让用if编一个五个数字从大到小的排序,有那个大神能帮我,谢谢啦...
  6. mie散射理论方程_电磁散射工程应用基础
  7. 一段良好的程序永远不应该发生panic异常
  8. OS内核参数(SEM)在高负载的Oracle数据库中如何设置
  9. php内存泄漏的后果,记一次php内存泄漏的排查经过
  10. for循环删除集合陷阱
  11. ORACLE检查点测试,oracle深度解析检查点
  12. CSS网页切图经验与要点
  13. 如何在InfoPath2010中转换主数据源
  14. 【游戏】Win 10 运行红色警戒2
  15. NFT头像屡拍天价,如何从理性角度分析其市场价值?
  16. 想长胖的人看过来,几招教你变胖|猎人营
  17. 百度bae专业版svn提交问题
  18. unity 使用像素实现墙面子弹留孔效果(给已有贴图模型叠加贴图)
  19. python 听歌识曲_Shazam听歌识曲算法解析+python实现-3 检索歌曲
  20. 色调映射:Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation

热门文章

  1. 【Git版本控制】为什么要先commit,然后pull,最后再push?而不是commit然后直接push?...
  2. 对float浮动的我的理解,形象生动一点
  3. VS2015--win32project配置的一些想法之在 Visual Studio 2015 中进行调试的同一时候分析性能...
  4. SpringMvc 事务的注解配置、实现、挂起
  5. 控制文字长度,多出的文字用省略号代替
  6. deepin启动盘无法引导安装_深度启动盘制作工具(Deepin Boot Maker)怎么安装kubuntu?Deepin Boot Maker图文教程...
  7. hdu4784 不错的搜索( 买卖盐,要求整钱最多)
  8. hdu4665 DFS
  9. 【数字信号处理】相关函数 ( 相关函数性质 | 相关函数最大值 | 自相关函数最大值 | 互相关函数最大值 | 能量有限信号的相关函数在 m 趋近无穷时为 0 )
  10. 【Windows 逆向】使用 Cheat Engine 工具进行指针扫描挖掘关键数据内存真实地址 ( 指针扫描 )