基本思想

通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。

此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。

初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 … 重复该操作,直到遍历完所有顶点

操作步骤

(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为”起点s到该顶点的距离”[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。

(2) 从U中选出”距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。

(3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。

(4) 重复步骤(2)和(3),直到遍历完所有顶点。

实现

// 邻接矩阵
typedef struct _graph
{char vexs[MAX];       // 顶点集合int vexnum;           // 顶点数int edgnum;           // 边数int matrix[MAX][MAX]; // 邻接矩阵
}Graph, *PGraph;// 边的结构体
typedef struct _EdgeData
{char start; // 边的起点char end;   // 边的终点int weight; // 边的权重
}EData;

Graph是邻接矩阵对应的结构体。
vexs用于保存顶点,vexnum是顶点数,edgnum是边数;matrix则是用于保存矩阵信息的二维数组。例如,matrix[i][j]=1,则表示”顶点i(即vexs[i])”和”顶点j(即vexs[j])”是邻接点;matrix[i][j]=0,则表示它们不是邻接点。
EData是邻接矩阵边对应的结构体。

迪杰斯特拉算法

/** Dijkstra最短路径。* 即,统计图(G)中"顶点vs"到其它各个顶点的最短路径。** 参数说明:*        G -- 图*       vs -- 起始顶点(start vertex)。即计算"顶点vs"到其它顶点的最短路径。*     prev -- 前驱顶点数组。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。*     dist -- 长度数组。即,dist[i]是"顶点vs"到"顶点i"的最短路径的长度。*/
void dijkstra(Graph G, int vs, int prev[], int dist[])
{int i,j,k;int min;int tmp;int flag[MAX];      // flag[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。// 初始化for (i = 0; i < G.vexnum; i++){flag[i] = 0;              // 顶点i的最短路径还没获取到。prev[i] = 0;              // 顶点i的前驱顶点为0。dist[i] = G.matrix[vs][i];// 顶点i的最短路径为"顶点vs"到"顶点i"的权。}// 对"顶点vs"自身进行初始化flag[vs] = 1;dist[vs] = 0;// 遍历G.vexnum-1次;每次找出一个顶点的最短路径。for (i = 1; i < G.vexnum; i++){// 寻找当前最小的路径;// 即,在未获取最短路径的顶点中,找到离vs最近的顶点(k)。min = INF;for (j = 0; j < G.vexnum; j++){if (flag[j]==0 && dist[j]<min){min = dist[j];k = j;}}// 标记"顶点k"为已经获取到最短路径flag[k] = 1;// 修正当前最短路径和前驱顶点// 即,当已经"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。for (j = 0; j < G.vexnum; j++){tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出if (flag[j] == 0 && (tmp  < dist[j]) ){dist[j] = tmp;prev[j] = k;}}}// 打印dijkstra最短路径的结果printf("dijkstra(%c): \n", G.vexs[vs]);for (i = 0; i < G.vexnum; i++)printf("  shortest(%c, %c)=%d\n", G.vexs[vs], G.vexs[i], dist[i]);
}

references

Dijkstra算法(一)之 C语言详解 - 如果天空不死 - 博客园

数据结构之Dijkstra算法相关推荐

  1. 大话数据结构:最短路径算法

    dijkstra最短路径算法 迪杰斯特算法的核心是首先正向把离起点最近的点一个一个找出来,然后从终点开始逆向计算最短路径 利用图数据结构实现dijkstra算法的伪代码如下 {记录所有点到起点的距离并 ...

  2. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  3. 【数据结构与算法】【算法思想】Dijkstra算法

    图的两种搜索算法,深度优先搜素和广度优先搜索.这两种算法主要是针对无权图的搜索算法.针对有权图,也就是图中的每条边都有一个权重,该如何计算两点之间的最短路径?最短路径算法(Shortest Path ...

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

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

  5. aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)

    「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...

  6. 【数据结构】图(最短路径Dijkstra算法)的JAVA代码实现

    最短路径的概念 最短路径的问题是比较典型的应用问题.在图中,确定了起始点和终点之后,一般情况下都可以有很多条路径来连接两者.而边或弧的权值最小的那一条路径就称为两点之间的最短路径,路径上的第一个顶点为 ...

  7. Dijkstra 算法-《数据结构》严蔚敏

    应用介绍 假定某个销售做年度出差计划,每次需要从固定城市出发,去其它城市推销产品,那么问题就来了,如果求得从固定城市到其它拜访城市的最短路径或最小时间呢? 这就是一个典型的Dijkstra求解问题. ...

  8. 数据结构课程设计——项目2:校园导游咨询(图 Dijkstra算法寻找最短路径)

    数据结构课程设计--项目2:校园导游咨询(图 Dijkstra算法寻找最短路径) 一.问题描述和项目要求 1.1 问题描述 1.2 基本要求 二.问题分析 2.1 程序功能设计分析 2.2 程序实现分 ...

  9. 【数据结构 | C语言】Dijkstra算法(迪杰斯特拉算法)

    文章目录 一.Dijkstra 算法介绍 二.算法 C语言 三.完整代码 四.示例 一.Dijkstra 算法介绍 Dijkstra算法解决了单源点的最短路径 Dijkstra 算法是贪心算法 步骤: ...

最新文章

  1. 第三代测序单分子荧光测序之Pacbio 测序原理
  2. INPUT type=password 元素 | input type=password 对象
  3. H3 BPM微信接入配置
  4. RocketMQ-初体验RocketMQ(04)_使用RocketMQ Console源码搭建RocketMQ Console与基本使用
  5. putty连接虚拟fedaro失败的解决方法
  6. Exploit开发系列教程-Exploitme2 (Stack cookies SEH)
  7. ajax php登陆界面,实例详解Ajax实现漂亮、安全的登录界面
  8. 2021 年前端学习路线总结
  9. C#串口通信工作笔记0001---上位机开发_嵌入式_串口助手_收发数据开发
  10. OA系统:规避选型误区
  11. android开发微博前的包准备,新浪微博开发之前期准备篇
  12. php微信公众平台开发获取access_token,用CURL出现certificate verify failed错误的解决方法...
  13. 【微软力作】虚拟对抗训练:让预训练模型再次强大!
  14. 二元最近的共同祖先问题(O(n) time 而且,只有一次遍历,O(1) Space (它不考虑函数调用栈空间))...
  15. 腾讯专访 | 子芽:代码疫苗技术,赋能数字化应用内生安全自免疫
  16. Python解释器(Interpreter)介绍
  17. springMVC+mybatis
  18. 第十五周助教工作总结——NWNU李泓毅
  19. 华为发展鸿蒙再出奇招,学习宝马推出官方认证二手手机
  20. 算法学习 - 拼接成最大的数字

热门文章

  1. 关于知识图谱,我们接下来该研究什么?斯坦福教授们给出了答案
  2. Litho在美团动态化方案MTFlexbox中的实践
  3. Netty的实现原理、特点与优势、以及适用场景
  4. 开源开放 | 中国近代历史人物知识图谱
  5. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)
  6. ThinkPHP3(添加,修改,删除)
  7. python opencv3 检测人
  8. php 之fsockopen(转)
  9. 关于GPS 车辆定位导航中的投影变换
  10. 【操作系统复习】进程的状态与转换