算法学习之Dijkstra(迪杰斯特拉)

本文详细介绍了Dijkstra算法,一种用于寻找图中单源最短路径的算法。通过逐步解析算法过程,展示了如何从起点开始,逐步扩展至所有顶点,确保在扩展过程中始终保持最短路径。以一个具体的无向图示例,演示了算法的执行步骤,解释了如何更新顶点间的最短路径,并最终找到所有顶点到起点的最短路径。
摘要由CSDN通过智能技术生成

1、定义概览

Dijkstra(迪杰斯特拉)算法是典型的单源路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层扩展,知道扩展到终点为止。Dijkstra算法是具有代表性的最短路径算法,注意该算法要求图中不存在负权边。

问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

2、算法描述

1)算法思想:设 G=(V,E) 是一个带权有向图,把图中顶点集合V分成两组。

第一组为以求出最短路径的顶点集合 (用S表示,初始时S中只有一个源点,以后每求得一条最短路径,就将其加入到集合S中,直到全部顶点都加入到S中);

第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组顶点加入S中。再加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

(1)初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为“起点s到该顶点的距离” 【例如:U中顶点v的距离 (s,v) 的长度,然后s和v不相邻,则v的距离为正无穷】。

(2)从U中选出“距离最短的顶点k”, 并将顶点k加入到S中;同时,从U中移除顶点k。

(3)更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其他顶点的距离;【例如:(s,v)的距离可能大于(s,k)+(k,v)的距离】

(4)重复(2)和(3),直到遍历完所有顶点。

步骤如下:

 

 

 

初始状态:S是已计算出最短路径的顶点集合,U是未计算除最短路径的顶点的集合!
第1步:将顶点D加入到S中。
              S={D(0)}, U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}。【注:C(3)表示C到起点D的距离是3。】

第2步:将顶点C加入到S中。
    上一步操作之后,U中顶点C到起点D的距离最短;因此,将C加入到S中,同时更新U中顶点的距离。以顶点F为例,之前F到D的距离为∞;但是将C加入到S之后,F到D的距离为9=(F,C)+(C,D)。
            S={D(0),C(3)}, U={A(∞),B(13),E(4),F(9),G(∞)}。 

第3步:将顶点E加入到S中。
    上一步操作之后,U中顶点E到起点D的距离最短;因此,将E加入到S中,同时更新U中顶点的距离。还是以顶点F为例,之前F到D的距离为9;但是将E加入到S之后,F到D的距离为6=(F,E)+(E,D)。
          S={D(0),C(3),E(4)}, U={A(∞),B(13),F(6),G(12)}。 

第4步:将顶点F加入到S中。
          S={D(0),C(3),E(4),F(6)}, U={A(22),B(13),G(12)}。

第5步:将顶点G加入到S中。
         S={D(0),C(3),E(4),F(6),G(12)}, U={A(22),B(13)}。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值