【图】最短路径:迪杰斯特拉(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> <script type="math/tex" id="MathJax-Element-31"> </script> 权值为

      • U 中选取一个距离 v 最小的顶点 k ,把 k加入 S 中(该选定的距离就是 v k 的最短路径长度)。
      • k 为新考虑的中间点,修改 U 中各顶点的距离;若从源点v 到顶点 u 的距离(经过顶点 k)比原来距离(不经过顶点 k )短,则修改顶点 u 的距离值,修改后的距离值的顶点 k 的距离加上边上的权。
      • 重复步骤 2 和 3 直到所有顶点都包含在 S 中。
      • 算法实例

        给出一个无向图:
        这里写图片描述
        用Dijkstra算法找出以 v0 为起点的单源最短路径步骤如下:
        这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值