首先,我们来看一下相关的图的一些基本知识点:
图:图 G=(V,E) 由顶点集 V 和边集 E 组成。每条边对应一个点对 (v,w),其中 v,w 属于 V 。如果图中的点对是有序的,那么该图就是有向图,反之为无向图。
邻接点:若顶点 v 与 w 之间存在一条边,则认为顶点 v 与 w 邻接。
权:图中的每条边都可以对应一个数值,这种与边相关的数值称为权。
路径:在图 G 中,顶点 v1 到 vk 的路径是一个顶点序列 v1,v2,···,vk。
接下来我们进入正题:
单源最短路径问题,即在带权图中指定一个起始点 v ,找出从 v 到图中其余每个顶点的最短距离。迪杰斯特拉算法是解决单源最短路径问题的一个经典算法。该算法按阶段进行,在每个阶段,算法首先选择一个顶点 u ,该顶点在所有剩余顶点中与起始点 v 的距离最近,然后以此距离为基础,更新起始点 v 与其余未被选中的顶点之间的路径距离,接着继续进行选择,直到所有顶点都被选择到,算法结束。
具体步骤如下:
(1)假设 S 为已求得最短路径的终点的点集,在初始时,S 只包含起始点 v ,而点集 U 包含图中除了顶点 v 以外的所有顶点。
(2)从 U 中选择一个顶点 u ,它是源点 v 到 U 的距离最近的一个顶点,将 u 加入 S。
(3)继续从 U 中选择下一个与源点距离最近的顶点。
(4)重复步骤 3 ,直到点集 U 为空。

以上方无向有权图为例。具体实现过程中,我们需要创建三个辅助数组 Adjvex[],Lowcost[],Flag[]。Adjvex[i]=j 表示从起始点到达顶点 i 会经过顶点 j (主要用于求出最短路径); Lowcost[i] 表示从起始点到顶点 i 的最短距离(初始化为无限大); Flag[i] 标注顶点 i 是否已被选中(初始化为0)。用图表示程序实现过程如下:
1、这里我们以 v3 作为起始点。由于只有一个点,故Adjvex的值全为3; Lowcost 行加入各点到v3 的距离; Flag[3]置为1。如下图所示:
| 编号 | 1 | 2 | 3 | 4 | 5 |
| Adjvex | 3 | 3 | 3 | 3 | 3 |
| Lowcost | 8 |
|

本文详细介绍了迪杰斯特拉算法的基本原理及其在单源最短路径问题中的应用。通过实例讲解了算法的具体步骤,并提供了基于邻接表结构的C++实现代码。
最低0.47元/天 解锁文章
4万+

被折叠的 条评论
为什么被折叠?



