透彻理解迪杰斯特拉算法

news/2024/11/24 4:19:47/

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,这个算法我主动学了三遍,第一主动学的时候,是看严蔚敏的《数据结构》,当时应该是学懂了,有点透彻地理解了这个算法,但是没有记录下来,后来就忘记了, 第二次主动学,就去网上找相关文章,看了不少关于这个算法的讲解,但总感觉都没有讲透,看得我二懂二懂的,昨天晚上,突然又想到这个算法,发现我还是不熟悉这个算法,又忘记Dijkstra 算法是怎么一回事了,决定再看这个算法一遍,虽然已经快12点了,平时这个时候已经躺床上了。 这次终于彻底搞懂,并决定写成博客记录下来。

Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索。
把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于BFS搜索。

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

2.算法描述
1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

例子
先给出一个无向图
用Dijkstra算法找出以A为起点的单源最短路径步骤如下

不要看算法的动画,理解算法的时候,思维更不上GIF动画的速度,这两张图对理解算法最管用
重点需要理解这句拗口的"按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度"

实际上,Dijkstra 算法是一个排序过程,就上面的例子来说,是根据A到图中其余点的最短路径长度进行排序,路径越短越先被找到,路径越长越靠后才能被找到,要找A到F的最短路径,我们依次找到了
A --> C 的最短路径 3
A --> C --> B 的最短路径 5
A --> C --> D 的最短路径 6
A --> C --> E 的最短路径 7
A --> C --> D --> F 的最短路径 9
Dijkstra 算法运行的附加效果是得到了另一个信息,A到C的路径最短,其次是A到B, A到D, A到E, A到F

为什么Dijkstra 算法不适用于带负权的图?
就上个例子来说,当把一个点选入集合S时,就意味着已经找到了从A到这个点的最短路径,比如第二步,把C点选入集合S,这时已经找到A到C的最短路径了,但是如果图中存在负权边,就不能再这样说了。举个例子,假设有一个点Z,Z只与A和C有连接,从A到Z的权为50,从Z到C的权为-49,现在A到C的最短路径显然是A --> Z --> C

对带负权的图,应该用Floyd算法

再举一例, 初点a到b最短有权10,b到c有权50,a到d有权30,d到c有权20,求a到c的最短路径。
dijkstra

迪杰斯特拉算法的运行过程是一个排序的过程,既不是深度优先也不是广度优先算法。 就这个简单的例子而言,a和b都被加入S集合后,这时下一个要加入S集合结点,并不一定是c节点。 请把a和b节点组成的集合作为一个整体来考虑,当算法运行到 a和b 都被加入S集合后,你甚至都可以把 a 和 b在图中去掉用一个虚拟的s节点来表示,a 和 b 作为一个整体后,和这个整体相连接的边,最短的就是 a 到 d 这条边,但是,这时并不能直接因为这条边的权最小 就将d 加入 S 集合; 现在,再来假设 b 到 c的权不是50,而是25; 现在和 S 集合相连接的边有a到d 30, b到c 25; 这时,b到c的权值最小,但却不能加入S集合, 因为 a 到 b 再到 c的权是 10 + 25 已经大于 a 到 d的权 30, 所以 d 应该加入 S 集合,而不是 c; 如果b 到 c的权值小于20,就是 c先加入 S 集合,而不是 d 了; b 到 c的权值恰好等于20,那么随便,先把d加入 S 还是 先把 c 加入 S,都是一样的,没有区别。

另外,任意一点k,加入s集合后,就已经找到了从源点a到k的最短路径,前提条件是图中不能有带负数的权值边。 我这样表述可以让算法更清楚,还是这个例子, a和b都被选入 S 集合后,去更新整个图,把a和b都去掉,用新节点 s 代替a和b,s 到 d 有权30, s 到 c 有权 10+50, 下一步该选哪个节点并入 S 集合一目了然了吧。 d点选入 S 集合后,再把d点从图中抹去,更新虚拟的节点 s到c的权


http://www.ppmy.cn/news/527544.html

相关文章

思杰技术的论坛网址(转)

https://www.demoffice.com/?cat11 分类:Citrix Citrix平台 – 软件和补丁下载(不定期更新) [……] 继续阅读 发布于2019年5月15日分类all、Citrix、常用资源标签SoftwaresCitrix平台 – 软件和补丁下载(不定期更新)有7条评论 如何通过XenServer PowerShell 脚…

迪杰斯特拉(Dijkstra)算法

基本思想 Dijkstra算法是一种典型的最短路径搜索算法,和之前的BFS和DFS算法类似,Dijkstra本质上是一种BFS搜索算法。 一般步骤如下: 建立两个集合S和U,S中存放已经确定了最短距离的点,U中放未放入S中的点。在S中pus…

迪杰斯特拉算法浅析

所谓的迪杰斯特拉算法,就是一个用来求一个图中某点到其它点的最短路径的算法。 大致方法: 遍历所有节点,找到离起点最近的一个点(那么这个点到起点的最小距离肯定是起点到这个点的这条边的权值),然后标记这…

日立电子显微镜维修电源柜检测方案

根据使用方反应的设备损坏原因为摔坏。由于非正常使用损坏造成不能正常工作,故存在二次故障的可能:1.摔过后的结构性损坏。2.因结构性损坏后造成电路异常而烧坏内部电气产品。实际需要对电源柜整体进行全面检测,因不同机型设备结构接线存在差…

日立mCA连接服务器显示地址异常,日立电梯Mca的故障代码是什么

满意答案 yue498744818 推荐于 2017.10.14 采纳率:41% 等级:11 已帮助:12960人 10 主微机故障11 副微机故障12 运行接触器短接故障1314 安全继电器短接故障15 安全回路断开故障16 软件WDT动作17 连续3次开门锁死 20 抱闸制动器短接故障21 …

oracle pfm,多平台监控管理 日立JP1/PFM 性能详解

【IT168 资讯】日立JP1经多年调研发现,企业要确保系统始终提供高效稳定的服务质量并能应对环境变化,IT规范化、自动化、运行监控三大关键因素必不可少。其中,运行监控上的应对体现在根据业务制定需求,全面监控整个IT系统。日立JP1…

日立一体化机芯 S888N 串口控制命令

先分享一个日立一体化机芯的资料,日立机芯的串口通信协议基本上是相同,这个S888N为D1的,DI-SC110为720P的,控制命令,需要的朋友可以参考下。

日立能源证实受GoAnywhere攻击影响,数据遭泄露

聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 日立能源公司证实称,Clop 勒索团伙通过GoAnyway 0day漏洞窃取数据后,公司数据遭泄露。 日立能源是日本工程技术巨头日立的一部分,专注于能源解决方案和电…