• [数据结构]Dijkstra算法求单源最短路径


    概念

      求带权有向图中某个源点到其余各个顶点的最短路径,最常用的是Dijkstra算法。该算法设置一个集合S记录已求得的最短路径的顶点,可用一个数组s[]来实现,初始化为0,当s[Vi]=1时表示将顶点Vi放入S中,初始时把源点V0放入S中。此外,在构造过程中还设置了两个辅助数组:
      dist[]:记录了从源点v0到其他各个顶点当前的最短路径长度,dist[i]初值为arcs[V0][i]。
      path[]:path[i]表示从源点到顶点i之间的最短路径的前驱结点,在算法结束时,可根据其值追溯得到源点V0到定点Vi的最短路径。
      假设从定点0出发,即V0=0,集合S最初只包含顶点0,邻接矩阵arcs表示带权有向图,arcs[i][j]表示有向边

    实例及解析

    这里写图片描述

      这里写图片描述

    分析步骤(注意这是个有向图!):

    1. 第一趟,由于我们从V1开始,可以直接遍历到V2,V5;我们可以看到V1-V2的权值为10,V1-V5的权值为5,所以我们选最短的那一条路径,即V1-V5。
    2. 第二趟,我们可以从V1,V5,可以直接遍历到V2,V3,V4;V5-V2的权值为8(我们也可以从v1-v2,但是从v1-v5-v2的路径更短),V5-V3的权值为14,V5-V4的权值为7,我们选择最短的那一条路径,即V5-V4。
    3. 第三趟,我们可以从V1,V5,V4出发,可以遍历到V2,V3;V1-V5-V2为8,V1-V5-V4-V3为13,所以选最短的那一条,即V1-V5-V2为8。
    4. 第四趟,只剩下最后一个顶点,也就是V3,从V1-V5-V2-V3路径长度为9,遍历完成。

    算法复杂度

      这个算法的时间复杂度为O(|V|²),如果要找出所有结点对之间的最短距离,则需要对每个结点运行一次Dijkstra算法,时间复杂度为O(|V|³)

    注意

     如果边上带有负权值,Dijkstra算法并不使用。若允许边上带有负权值,则可能出现当与S内某点以负边连接的点确定其最短路径时,它的最短路径加上这条负边的权值结果可能小于a原先确定的最短路径长度,而此时a在Dijkstra算法下是无法更新的。
    
    https://github.com/li-zheng-hao
  • 相关阅读:
    cxVerticalGrid赋值是实时更新
    cxGrid类似pagecontrol的效果
    cxgrid属性说明,每次用的时候费时费力查找。
    做一个平均数,合计数的sql查询
    FDMemTable 提示操作速度尤其是循环
    手机号码验证
    取字符串长度
    DELPHI 获取本月 的第一天 和 最后一天
    SQL Server 断开某个数据库所有连接(还原的时候需要)转自用保留
    元宇宙六大核心技术
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053733.html
Copyright © 2020-2023  润新知