最短路径算法|Dijkstra‘s Algorithm

这篇具有很好参考价值的文章主要介绍了最短路径算法|Dijkstra‘s Algorithm。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最短路径问题几乎是每个计算机专业学生的必学知识点,相关的算法也比较多样,但其中最经典的肯定是由荷兰计算机科学家,1972年图灵奖得主Edsger Dijkstra于1959年发布的Dijkstra's Algorithm。

最短路径问题简单来说就是给定一个图和图中的一个源顶点,找到从源到给定图中所有顶点的最短路径。

举个简单的例子:

下面这张图,给定起点为src = 0

最短路径算法|Dijkstra‘s Algorithm

正确的输出结果应为:0 4 12 19 21 11 9 8 14

解释: 

  • 0 到 1 的距离 = 4.
  • 0 到 2 的最小距离 = 12. 0->1->2
  • 0 到 3 的最小距离 = 19. 0 ->1->2->3
  • 从 0 到 4 的最小距离 = 21. 0->7->6->5->4
  • 从 0 到 5 的最小距离 = 11. 0->7->6- >5
  • 从 0 到 6 的最小距离 = 9。 0->7->6
  • 从 0 到 7的最小距离 = 8。 0->7
  • 从 0 到 8 的最小距离 = 14。 0->1->2 ->8

具体步骤为:

  • 创建一个集合sptSet(最短路径树集合),跟踪包含在最短路径树中的顶点,即计算并最终确定其与源的最小距离。最初,这个集合是空的。 
  • 为输入图中的所有顶点分配一个距离值。将所有距离值初始化为正无穷。将源顶点的距离值指定为 0,以便首先获取它。
  • 虽然sptSet不包括所有顶点
    • 选择一个在sptSet中不存在且具有最小距离值的顶点u 。
    • 将u添加到sptSet集合中
    • 然后更新u的所有相邻顶点的距离值。 
      • 要更新距离值,必须遍历所有相邻顶点。 
      • 对于每个相邻的顶点v,如果u的距离值(到源)与边uv的权重之和小于v的距离值,则更新v的距离值。 

注意:我们使用布尔数组 sptSet[] 来表示 SPT 中包含的顶点集。如果值 sptSet[v] 为true,则顶点 v 包含在 SPT 中,否则不包含。数组 dist[] 用于存储所有顶点的最短距离值。

还是以上方的插图为例:

最短路径算法|Dijkstra‘s Algorithm

以0为起点

步骤1:

  • 集合sptSet最初是空的,分配给顶点的距离是 {0, INF, INF, INF, INF, INF, INF, INF},其中INF表示无限。 
  • 现在选择具有最小距离值的顶点。选择顶点 0,将其添加在sptSet中。所以sptSet变成 {0}。之后更新其相邻顶点的距离值。 
  • 0 的相邻顶点分别是 1 和 7。1 和 7 的距离值更新为 4 和 8。 

以下子图显示了顶点及其距离值,仅显示了具有有限距离值的顶点。SPT 中包含的顶点以绿色显示。

最短路径算法|Dijkstra‘s Algorithm

第2步:

  • 选择距离值最小且尚未包含在 SPT 中(不在 sptSET 中)的顶点。顶点 1 被拾取并添加到 sptSet。 
  • 所以 sptSet 现在变成 {0, 1}。更新相邻顶点的距离值为 1。 
  • 顶点 2 的距离值变为12

最短路径算法|Dijkstra‘s Algorithm

第 3 步: 

  • 选择距离值最小且尚未包含在 SPT 中(不在 sptSET 中)的顶点。顶点 7 被选中。所以 sptSet 现在变成{0, 1, 7}。 
  • 更新 7 的相邻顶点的距离值。顶点 6 和 8 的距离值更新(分别为15 和 9)。 

最短路径算法|Dijkstra‘s Algorithm

第4步:

  • 选择距离值最小且尚未包含在 SPT 中(不在 sptSET 中)的顶点。顶点 6 被选中。所以 sptSet 现在变成{0, 1, 7, 6}。 
  • 更新相邻顶点6的距离值。更新顶点5和8的距离值。

最短路径算法|Dijkstra‘s Algorithm

 不断重复上述步骤直到所有的节点都被添加到sptSet集合里面去,最后,我们得到以下最短路径树(SPT)。

最短路径算法|Dijkstra‘s Algorithm

笔记: 

  • 代码计算最短距离但不计算路径信息。创建一个父数组,在距离更新时更新父数组(类似Prim最小生成树算法),并用它来显示从源到不同顶点的最短路径。
  •  Dijkstra's Algorithm 可用于有向图和无向图。
  • 该代码找到从源到所有顶点的最短距离。如果我们仅在从源到单个目标的最短距离中感兴趣,请在挑选的最小距离顶点等于目标时停止循环。
  • 实现的时间复杂度是O(V 2 )。调整后应用有限序列的做法可以将复杂度优化到 O(E * log V)
  • Dijkstra's Algorithm不适用于具有负权重循环的图。对于带有负边的图,它可能会给出正确的结果,但是您必须允许一个顶点可以被多次访问,并且该版本将失去其快速的时间复杂度。对于具有负权边和环的图,可以使用Bellman-Ford ,我们会将其作为单独的帖子进行讨论。

完整代码实现下载链接:

(包含各种语言:C语言、Python、Java、C++、C#、Javascript等均有示例)

免费​资源下载:Dijkstra's Algorithm文章来源地址https://www.toymoban.com/news/detail-412686.html

到了这里,关于最短路径算法|Dijkstra‘s Algorithm的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图算法——求最短路径(Dijkstra算法)

            目录 一、什么是最短路径 二、迪杰斯特拉(Dijkstra)算法  三、应用Dijkstra算法 (1) Dijkstra算法函数分析         求图的最短路径在实际生活中有许多应用,比如说在你在一个景区的某个景点,参观完后,要怎么走最少的路程到你想参观的下个景点,这就利用到

    2023年04月15日
    浏览(39)
  • 【算法】单源最短路径算法——Dijkstra算法

    迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。这是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用 贪心算法 的策略, 每次遍历到始点距离最

    2024年02月05日
    浏览(44)
  • Dijkstra算法求最短路

    Dijkstra算法的流程如下: 1.初始化dist[1] = 0,其余节点的dist值为无穷大。 2.找出一个未被标记的、dist[x]最小的节点x,然后标记节点x。 3.扫描节点x的所有出边(x,y,z),若dist[y] dist[x] + z,则使用dist[x] + z更新dist[y]。 4.重复上述2~3两个步骤,直到所有的节点都被标记。 Dijk

    2024年02月06日
    浏览(43)
  • 294.【华为OD机试】路口最短时间问题( Dijkstra 算法Java&Python&C++&JS实现)

    🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年03月13日
    浏览(75)
  • dijkstra模板及例题(最短路算法)

            大家好,我是永遇乐金枪鱼。图论和树论是算法中占比大且非常重要的内容,而且树论是特殊的图论,而图论中最经典的就是求解最短路,而最短路算法是比较广泛且冗杂的算法,与其相关的有较多的算法,下面我给大家讲讲常用算法之一——dijkstra算法。  📒博客

    2023年04月08日
    浏览(42)
  • 【Dijkstra】最短路算法的一种

    首先,本文默认读者基本熟悉Dijkstra基本原理 DIjkstra是单源最短路的一种算法。使用数组d[i]来储存结点i到源点s的最短路径长度,每次更新d[i]数组后,d[i]中最小的一定是一条最短路径长度。也就是说每次更新后都能找到一条最短路径,以下给出证明: 假设d[]数组中当前最小

    2024年02月03日
    浏览(53)
  • 二、搜索与图论6:Dijkstra 模板题+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)

    朴素dijkstra算法 对应模板题:Dijkstra求最短路 I 时间复杂是 O(n^2+m):n 表示点数,m 表示边数 堆优化版dijkstra 对应模板题:Dijkstra求最短路 II 时间复杂度 O(mlogn):n 表示点数,m 表示边数 树是一种特殊的图 ,与图的存储方式相同。 对于无向图中的边ab,存储两条有向边a-b, b-a。

    2024年02月14日
    浏览(34)
  • 12.图论1 最短路之dijkstra算法

    二分图 判定:染色法。 性质: 可以二着色。 无奇圈。 树的直径模板 两遍dfs/bfs,证明时反证法的核心是用假设推出矛盾。 设1是一开始随机选的点,s是与其最远的点,证明s是直径的一端。 反证:假设s不是直径的一端,ss是直径的一端。 现在要做的就是证明ss是直径的一端

    2024年02月20日
    浏览(46)
  • 数据结构--最短路径 Dijkstra算法

    计算  b e g i n  点到各个点的最短路 color{red}计算 begin 点到各个点的最短路 计算   b e g in   点到各个点的最短路 如果是无向图,可以先把无向图转化成有向图 我们需要2个数组 final[] (标记各顶点是否已找到最短路径)与 dis[] (最短路径⻓度)数组 Dijkstra算法是一种用于

    2024年02月12日
    浏览(35)
  • 最短路径算法 | Bellman-Ford Algorithm

    我们在之前的文章中已经讨论了最短路径算法中最经典的Dijkstra‘s Algorithm。然而,Dijkstra\\\'s Algorithm虽然好用,却仍然存在一些缺点即无法解决带有负权重路线的问题,改进后的Dijkstra算法尽管可以解决一些简单的负权重问题,但仍然无法解决带有负循环的图的最短路径问题。

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包