【图】最短路径:迪杰斯特拉(Dijkstra)算法

网图和非网图中,最短路径的含义不同:

  • 非网图中,因为没有边上的权值,最短路径指的是两顶点之间经过的边数最少的路径;
  • 网图中,最短路径指的是两顶点之间经过的边上权值之和最少的路径,并且称路径上的第一个顶点是源点,最后一个顶点是终点。

迪杰斯特拉(Dijkstra)算法

定义

Dijkstra(迪杰斯特拉)算法是单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。

特点

以起始点为中心向外层层扩展,直到扩展到终点为止。

基本思想

假设 G=(V,{E}) 是一个带权有向图,把图中顶点集合 V 分成两组,

  • 第一组为已求出最短路径的顶点集合 S 及其路径长度(初始时 S 中只有一个源点,以后每求得一条最短路径 , 就加入到集合 S 中,直到全部顶点都加入到 S 中)
  • 第二组为未确定最短路径的顶点集合 U 及其路径长度,按最短路径长度递增次序依次把 U 中的点加入 S 中。在加入的过程中,总保持从源点 v S 中各顶点的最短路径长度不大于从源点 v U 中任何顶点的最短路径长度。

此外,每个点对应一个距离, S 中点的路径长度就是从 v 到这个点的最短路径长度, U 中的点的路径长度,是从 v 到这个点由 S 中的顶点作为中间顶点的当前最短路径长度。

迪杰特斯拉算法不是一下子求出源点到其余各点的最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最短路径的基础上,求得更远顶点的最短路径,最终得到结果。

算法步骤

  1. 初始时, S 只包含源点,即 S{v} v 的距离为 0。 U 包含除 v 外的其他顶点,即: U={} ,若 v U 中顶点 u 有边,则 <u,v> 正常有权值,若 u 不是 v 的邻接点,则 <u,v> 权值为
  2. U 中选取一个距离 v 最小的顶点 k ,把 k 加入 S 中(该选定的距离就是 v k 的最短路径长度)。
  3. k 为新考虑的中间点,修改 U 中各顶点的距离;若从源点 v 到顶点 u 的距离(经过顶点 k )比原来距离(不经过顶点 k )短,则修改顶点 u 的距离值,修改后的距离值的顶点 k 的距离加上边上的权。
  4. 重复步骤 2 和 3 直到所有顶点都包含在 S 中。

算法实例

给出一个无向图:
《【图】最短路径:迪杰斯特拉(Dijkstra)算法》
用Dijkstra算法找出以 v0 为起点的单源最短路径步骤如下:
《【图】最短路径:迪杰斯特拉(Dijkstra)算法》

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/Wonder233/article/details/79104611
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞