【图论】Dijkstra算法求最短路

news2024/12/27 13:05:19

一、Dijkstra算法简介

Dijkstra算法是由河南荷兰计算机科学家狄克斯特拉(Dijkstra)于1959年提出的,因此又叫狄克斯特拉算法。

二、初识Dijkstra算法

在使用Dijkstra算法求最短路时,需要用到三个辅助数组:
v i s x vis_x visx:布尔数组,给 x x x 号结点打标记。初始化为 0 0 0
s t e p x step_x stepx:记录从固定起点到 x x x 号结点的最短路径,初始化为 + ∞ +\infty +
p r e x pre_x prex:记录 x x x 号结点的前一个结点,如果不理解前一个结点是什么意思,第三部分模拟过程中会讲解。

三、模拟Dijkstra算法求最短路径长度

首先看下面的图5。
图5
图5

假设我们要求从 0 0 0 号结点到 4 4 4 号结点的最短距离,下面是模拟过程:

  1. 初始化 v i s vis vis s t e p step step 数组,记录起点 s t e p 0 = 0 step_0=0 step0=0
  2. 找到目前未被标记的 s t e p step step 值最小的结点 0 0 0,标记 v i s 0 = 1 vis_0=1 vis0=1 0 0 0 号结点的邻接点有 1 1 1 7 7 7,边权分别为 4 4 4 8 8 8,记录 s t e p 1 = m i n ( s t e p 1 , s t e p 0 + 4 ) = 4 step_1=min(step_1,step_0+4)=4 step1=min(step1,step0+4)=4 s t e p 7 = m i n ( s t e p 7 , s t e p 0 + 8 ) = 8 step_7=min(step_7,step_0+8)=8 step7=min(step7,step0+8)=8 p r e 1 = 0 pre_1=0 pre1=0 p r e 7 = 0 pre_7=0 pre7=0
  3. 找到目前未被标记的 s t e p step step 值最小的结点 1 1 1,标记 v i s 1 = 1 vis_1=1 vis1=1 1 1 1 号结点的邻接点有 2 2 2 7 7 7,边权分别为 8 8 8 11 11 11,记录 s t e p 2 = m i n ( s t e p 2 , s t e p 1 + 8 ) = 12 step_2=min(step_2,step_1+8)=12 step2=min(step2,step1+8)=12 s t e p 7 = m i n ( s t e p 7 , s t e p 1 + 11 ) = 8 step_7=min(step_7,step_1+11)=8 step7=min(step7,step1+11)=8 p r e 2 = 1 pre_2=1 pre2=1(PS:此处因为 8 ≤ 15 8 \leq 15 815,所以无需对 s t e p 7 step_7 step7 p r e 7 pre_7 pre7 的值进行修改);
  4. 找到目前未被标记的 s t e p step step 值最小的结点 7 7 7,标记 v i s 7 = 1 vis_7=1 vis7=1 7 7 7 号结点的邻接点有 1 1 1 6 6 6 8 8 8,边权分别为 11 11 11 1 1 1 7 7 7,记录 s t e p 1 = m i n ( s t e p 1 , s t e p 7 + 11 ) = 4 step_1=min(step_1,step_7+11)=4 step1=min(step1,step7+11)=4 s t e p 6 = m i n ( s t e p 6 , s t e p 7 + 1 ) = 9 step_6=min(step_6,step_7+1)=9 step6=min(step6,step7+1)=9 s t e p 8 = m i n ( s t e p 8 , s t e p 7 + 7 ) = 15 step_8=min(step_8,step_7+7)=15 step8=min(step8,step7+7)=15 p r e 6 = 7 pre_6=7 pre6=7 p r e 8 = 7 pre_8=7 pre8=7
  5. 找到目前未被标记的 s t e p step step 值最小的结点 6 6 6,标记 v i s 6 = 1 vis_6=1 vis6=1 6 6 6 号结点的邻接点有 5 5 5 7 7 7 8 8 8,边权分别为 2 2 2 1 1 1 6 6 6,记录 s t e p 5 = m i n ( s t e p 5 , s t e p 6 + 2 ) = 11 step_5=min(step_5,step_6+2)=11 step5=min(step5,step6+2)=11 s t e p 7 = m i n ( s t e p 7 , s t e p 6 + 1 ) = 8 step_7=min(step_7,step_6+1)=8 step7=min(step7,step6+1)=8 s t e p 8 = m i n ( s t e p 8 , s t e p 6 + 6 ) = 15 step_8=min(step_8,step_6+6)=15 step8=min(step8,step6+6)=15 p r e 5 = 6 pre_5=6 pre5=6
  6. 找到目前未被标记的 s t e p step step 值最小的结点 5 5 5,标记 v i s 5 = 1 vis_5=1 vis5=1 5 5 5 号结点的邻接点有 2 2 2 3 3 3 4 4 4 6 6 6,边权分别为 4 4 4 14 14 14 10 10 10 2 2 2,记录 s t e p 2 = m i n ( s t e p 2 , s t e p 5 + 4 ) = 12 step_2=min(step_2,step_5+4)=12 step2=min(step2,step5+4)=12 s t e p 3 = m i n ( s t e p 3 , s t e p 5 + 14 ) = 25 step_3=min(step_3,step_5+14)=25 step3=min(step3,step5+14)=25 s t e p 4 = m i n ( s t e p 4 , s t e p 5 + 10 ) = 21 step_4=min(step_4,step_5+10)=21 step4=min(step4,step5+10)=21 s t e p 6 = m i n ( s t e p 6 , s t e p 5 + 2 ) = 9 step_6=min(step_6,step_5+2)=9 step6=min(step6,step5+2)=9 p r e 3 = 5 pre_3=5 pre3=5 p r e 4 = 5 pre_4=5 pre4=5
  7. 找到目前未被标记的 s t e p step step 值最小的结点 2 2 2,标记 v i s 2 = 1 vis_2=1 vis2=1 2 2 2 号结点的邻接点有 1 1 1 3 3 3 5 5 5 8 8 8,边权分别为 8 8 8 7 7 7 4 4 4 2 2 2,记录 s t e p 1 = m i n ( s t e p 1 , s t e p 2 + 8 ) = 4 step_1=min(step_1,step_2+8)=4 step1=min(step1,step2+8)=4 s t e p 3 = m i n ( s t e p 3 , s t e p 2 + 7 ) = 19 step_3=min(step_3,step_2+7)=19 step3=min(step3,step2+7)=19 s t e p 5 = m i n ( s t e p 5 , s t e p 2 + 4 ) = 11 step_5=min(step_5,step_2+4)=11 step5=min(step5,step2+4)=11 s t e p 8 = m i n ( s t e p 8 , s t e p 2 + 2 ) = 14 step_8=min(step_8,step_2+2)=14 step8=min(step8,step2+2)=14 p r e 3 = 5 pre_3=5 pre3=5 p r e 8 = 2 pre_8=2 pre8=2
  8. 找到目前未被标记的 s t e p step step 值最小的结点 8 8 8,标记 v i s 8 = 1 vis_8=1 vis8=1 8 8 8 号结点的邻接点有 2 2 2 6 6 6 7 7 7,边权分别为 2 2 2 6 6 6 7 7 7,记录 s t e p 2 = m i n ( s t e p 2 , s t e p 8 + 2 ) = 12 step_2=min(step_2,step_8+2)=12 step2=min(step2,step8+2)=12 s t e p 6 = m i n ( s t e p 6 , s t e p 8 + 6 ) = 9 step_6=min(step_6,step_8+6)=9 step6=min(step6,step8+6)=9 s t e p 7 = m i n ( s t e p 7 , s t e p 8 + 7 ) = 11 step_7=min(step_7,step_8+7)=11 step7=min(step7,step8+7)=11
  9. 找到目前未被标记的 s t e p step step 值最小的结点 3 3 3,标记 v i s 3 = 1 vis_3=1 vis3=1 3 3 3 号结点的邻接点有 2 2 2 4 4 4 5 5 5,边权分别为 7 7 7 9 9 9 14 14 14,记录 s t e p 2 = m i n ( s t e p 2 , s t e p 3 + 7 ) = 12 step_2=min(step_2,step_3+7)=12 step2=min(step2,step3+7)=12 s t e p 4 = m i n ( s t e p 4 , s t e p 3 + 9 ) = 21 step_4=min(step_4,step_3+9)=21 step4=min(step4,step3+9)=21 s t e p 5 = m i n ( s t e p 5 , s t e p 3 + 7 ) = 14 step_5=min(step_5,step_3+7)=14 step5=min(step5,step3+7)=14
  10. 找到目前未被标记的 s t e p step step 值最小的结点 4 4 4,标记 v i s 4 = 1 vis_4=1 vis4=1 4 4 4 号结点的邻接点有 3 3 3 5 5 5,边权分别为 9 9 9 10 10 10,记录 s t e p 3 = m i n ( s t e p 3 , s t e p 4 + 9 ) = 19 step_3=min(step_3,step_4+9)=19 step3=min(step3,step4+9)=19 s t e p 5 = m i n ( s t e p 5 , s t e p 4 + 10 ) = 11 step_5=min(step_5,step_4+10)=11 step5=min(step5,step4+10)=11
  11. 此时我们发现,所有结点都已经被标记过,结束搜索,起点 0 0 0 到终点 4 4 4 的最短距离为 s t e p 4 = 21 step_4=21 step4=21

四、模拟Dijkstra算法求最短路径

仍以上面的图5为例,搜索过程略。
从终点 x = 4 x=4 x=4 往回遍历,每遍历到一个结点就将其入栈,然后 x = p r e x x=pre_x x=prex。当遍历到起点 0 0 0 入栈后,结束遍历,输出栈。
得到结果 0 → 7 → 6 → 5 → 4 0 \rightarrow 7 \rightarrow 6 \rightarrow 5 \rightarrow 4 07654
代码将于2024年九月底完成,目前不予展示。
如果博客有错误,请联系我,我会尽快修正!鲁A济南车!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL技术内幕8:PostgreSQL查询执行器

0.简介 执行器是查询编译和存储引擎之间的连接模块,其负责将优化器输出的执行计划,进行初始化、执行,访问存储引擎并获得最终结果返回,本章主要介绍PG的执行器模型和其执行流程。 执行器的处理模型 常见的执行器的处理模型包含…

海南云亿商务咨询有限公司抖音电商服务的可靠之选

在这个短视频与直播电商风起云涌的时代,抖音作为其中的佼佼者,正引领着新一轮的消费潮流。而在这片充满机遇与挑战的电商蓝海中,海南云亿商务咨询有限公司犹如一颗璀璨新星,凭借其专业的服务与独到的策略,在抖音电商领…

缺失值插补解释:六种插补方法?

目录 一、说明 二、什么是缺失值,为什么会出现缺失值? 2.1 什么是缺失值? 2.2 为什么会出现缺失值? 2.3 缺失数据类型 2.4 为什么要关注缺失值? 三、数据集 四、缺失数据的插值方式 4.1 方法 1:List-wise D…

通过Python库ydata-profiling生成数据分析报告

一:ydata-profiling库的介绍 ydata-profiling是一个强大的 Python 库,它为 Pandas DataFrame 提供了快速的探索性数据分析(EDA)。它能够自动生成包含详细统计信息的交互式 HTML 报告,使得数据分析变得更加直观和便捷。…

设计模式 -- 中介者模式(Mediator Pattern)

1 问题引出 1.1 智能家庭项 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电…

idea插件【1】Smart Tomcat

一、简介 在开发过程中除了springboot项目支持jar运行,很多场景下需要使用到tomcat外置服务部署,此时我们可以使用idea插件Smart Tomcat (Smart Tomcat 插件是一个用于简化与 Tomcat 服务器交互的工具,它提供了一些额外的功能来增…

TCP协议相关特性

TCP(Transmission Control Protocol,传输控制协议)是互联网传输层协议之一,也是 TCP/IP 协议簇的核心协议。它的作用是在 IP 网络上提供可靠的、面向连接的通信。 TCP基本特点: 有链接,可靠传输, 面向字节流 ,全双工 TCP协议段格…

掌握盈利新技能:网格交易法分享

交易策略对于交易成功至关重要。一个有效的策略可以帮助你在市场中轻松获得盈利,而一个不恰当的策略就可能导致不少损失。今天,我们将来探讨网格交易法,这是一种特别适合震荡市场的交易策略。 什么是网格交易法? 网格交易法&#…

linux下oracle启动及关于pfile和spfile启动参数文件的配置

在现代企业环境中,Oracle数据库作为关键的业务支撑平台,承载着大量的数据处理和事务管理任务。 无论是对于DBA(数据库管理员)还是开发人员来说,掌握Oracle数据库的基本操作和配置技巧都是至关重要的。本文提供了一份全…

图形语言传输格式glTF和三维瓦片数据3Dtiles(b3dm、pnts)学习

文章目录 3DTilesb3dm一、glTF1.glTF 3D模型格式有两种2.glTF 场景描述结构3.glTF的JSON结构 二、 3DTiles 原文 工具资料 格式详解 格式详解! 3D Tiles 是一种开源的、优化的文件格式,支持逐级细节(LOD)和空间索引,使…

生成模型之训练

如图1所示。生成器和判 别器是两个网络,在训练前我们要先分别进行参数初始化。训练的第一步是固定生成器,只训 练判别器。因为生成器的初始参数是随机初始化的,所以它什么都没有学习到,输入一系列采 样得到的向量给它,…

Qt第三课 ----------widget的控件属性及stylesheet样式(css样式)的简单介绍

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

“论面向服务架构设计及其应用”写作框架,软考高级论文写作,系统架构设计师

第一章 项目摘要 2023年,我参与了某公司汽车物流系统的研发项目,担任系统架构设计师的角色。该项目旨在构建一个高效、灵活且可扩展的汽车物流管理系统,以优化物流流程,提升业务响应速度,并降低运营成本。系统涵盖了订…

RISC-V (八)定时器中断

​​​​​​​riscv中断的分类 Core local INTerrupt: CLINT CLINT编程接口-寄存器 mtime寄存器,由中断触发的时钟,按照固定频率计数。

中国化学工程第七建设校招|EAS测评题库智联招聘攻略考什么

中国化学工程第七建设有限公司(简称“七化建”)是一家隶属于中国化学工程集团有限公司的全资子公司,属于央企。公司业务领域广泛,包括石油化工、房屋建筑、水利水电、市政公用、道路桥梁等EPC总承包、技术开发、实业投资、贸易等。…

【Python 千题 —— 算法篇】回文字符串

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在计算机科学中,字符串操作是基础且广泛应用的内容之一。回文字符串是一个非常经典的问题,回文是一种对称的结构,这种结构在数学、文学和计算机科学中都…

css三点闪烁(可用于加载样式、标题等)

代码案例 HTML <div class"flexAlign loading"><div class"loading_item"></div><div class"loading_item"></div><div class"loading_item"></div> </div> <div class"ot…

山东省行政执法证照片要求及图像处理方法

在山东省&#xff0c;行政执法证是执法人员身份的重要标识&#xff0c;其照片的规范性对于证件的有效性至关重要。本文将详细介绍山东省行政执法证照片的要求&#xff0c;并提供使用手机相机拍照的实用方法&#xff0c;以确保照片符合标准。 一、山东省行政人员执法证照片拍摄要…

论文解读 | ACL2024 Outstanding Paper:因果指导的主动学习方法:助力大语言模型自动识别并去除偏见...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击阅读原文观看作者直播讲解回放&#xff01; 作者简介 孙洲浩&#xff0c;哈尔滨工业大学SCIR实验室博士生 概述 尽管大语言模型&#xff08;LLMs&#xff09;展现出了非常强大的能力&#xff0c;但它们仍然…

常见概念 -- DCM色散补偿

色散的概念 光是一种电磁波&#xff0c;在特定介质中&#xff0c;光的相速度随频率&#xff08;波长&#xff09;或传输模式有差异&#xff0c;造成光波在通过介质后&#xff0c;不同频率成分光波的相位形成分散或分离的效果&#xff0c;称为色散。 日常生活中&#xff0c;最…