算法详解——Dijkstra算法

  Dijkstra算法的目的是寻找单起点最短路径,其策略是贪心加非负加权队列

一、单起点最短路径问题

  单起点最短路径问题:给定一个加权连通图中的特定起点,目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是,这里关心的不仅仅局限于寻找一条从起点出发到任一其他顶点的单一最短路径;单起点最短路径问题要求的是一组路径,每条路径都从起点出发通向图中的一个不同顶点,当然,其中某些路径可能具有公共边。

二、Dijkstra算法原理

  Dijkstra算法是一种高效地找出图中从一个给定起点到所有其他顶点最短路径的方法。它按照距离起点的远近顺序,逐步确定到各个顶点的最短路径。具体来说,算法首先找到距离起点最近的顶点,并确定它们之间的最短路径;然后,它接着寻找下一个最近的顶点,依此类推。在第 i i i 次迭代之前,算法已经确定了到达最近的 i − 1 i-1 i1个顶点的最短路径,这些顶点及其路径构成了原图的一个子图,形成一棵以起点为根的树。

  重要的是,由于图中所有边的权重都为非负,算法能够保证每次迭代找到的是当前可达顶点中距离起点最近的一个。这些待选顶点,称为“边缘顶点”,位于已构建的子树的外围。理论上,图中的所有其他顶点也可以被视为边缘顶点,但它们与树中顶点的连接权重被假设为无限大。

  为了求出下一个最接近起点的顶点,Dijkstra算法计算每个边缘顶点至其最近的树内顶点的距离(即该边的权重),并将此距离与从起点到该树内顶点的已知最短路径长度相加。在所有这些候选顶点中,算法选择总和最小的顶点作为下一个最近顶点。Dijkstra算法的核心在于,通过仅对这些特定的候选路径进行比较,就可以有效地找到最短路径。

三、Dijkstra算法应用

  为了简化算法的实施过程,我们为每个顶点引入两个辅助标记。第一个标记是一个数值标记 d d d,它记录了从算法开始到当前为止,从起点到该顶点的最短路径长度。随着算法的进行,当新的顶点被加入到树中时, d d d 的值更新为从起点到这个新顶点的最短路径长度。第二个标记则记录了该路径上的倒数第二个顶点,即当前构建的树中该顶点的父节点(对于起点以及那些尚未与树中的顶点直接相连的顶点,这个标记不必指定)。有了这两个标记后,寻找下一个最近顶点 u ∗ u^{ *} u 变得相对直接:我们仅需在所有边缘顶点中找到具有最小 d d d 值的顶点即可,而这个查找过程的顺序并不重要。这样,这两个标记极大地简化了算法的步骤,使得确定最短路径的过程更加高效和直观。

在确定了加入树中的顶点u*以后,还需要做两个操作:

  • u ∗ u^{ *} u 从边缘集合移到树顶点集合中。

  • 对于余下的每一个边缘顶点 u u u,如果通过权重为 w ( u ∗ , u ) w(u^{ *}, u) w(u,u) 的边和 u ∗ u^{ *} u 相连,当 d u ∗ + w ( u ∗ , u ) < d u d_{u^{*}} +w(u^{*},u)<d_{u} du+w(u,u)<du时,把 u u u 的标记分别更新为 u ∗ u^{ *} u d u ∗ + w ( u ∗ , u ) d_{u^{*}} +w(u^{*},u) du+w(u,u)

在这里插入图片描述
  最短的路径(从左列中的目标项点根据非数字标记向起点回溯,来确定最短路径)和它们的长度(由树中数字标记给出)如下:

  • a a a b b b : a − b a-b ab, 长度为3

  • a a a d d d : a − b − d a-b-d abd, 长度为5

  • a a a c c c ; a − b − c a-b-c abc, 长度为7

  • a a a e e e : a − b − d − e a-b-d-e abde,长度为9

Dijkstra(G, s)
# 单起点最短路径的Dijkstra算法
# 输入: 带有非负权重的连通图G=<V, E>以及起点顶点s
# 输出: 对于V中的每个顶点v,从s到v的最短路径长度d[v],
# 以及路径上的倒数第二个顶点p[v]Initialize(Q)  # 将顶点优先队列初始化为空
for v in V:d[v] ← ∞p[v]NoneInsert(Q, v, d[v])  # 初始化优先队列中顶点的优先级d[s]0
Decrease(Q, s, d[s])  # 更新s的优先级为d[s]
p[s]Nonefor i from 0 to |V| - 1 do:u ← DeleteMin(Q)  # 删除优先级最小的元素for 每一个与u相邻的顶点u' do:if d[u] + w(u, u') < d[u']:d[u'] ← d[u] + w(u, u')p[u'] ← uDecrease(Q, u', d[u'])

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode-21合并两个有序链表】

题目详情&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 […

程序人生——Java中基本类型使用建议

目录 引出Java中基本类型使用建议建议21&#xff1a;用偶判断&#xff0c;不用奇判断建议22&#xff1a;用整数类型处理货币建议23&#xff1a;不要让类型默默转换建议24&#xff1a;边界、边界、还是边界建议25&#xff1a;不要让四舍五入亏了一方 建议26&#xff1a;提防包装…

【Hadoop】Hadoop的运行模式

目录 Hadoop 的运行模式1.本地模式1.1官方 Grep 案例1.2官方 WordCount 案例 2.伪分布式运行模式2.1启动 HDFS 并运行 MapReduce 程序2.1.1 配置集群&#xff0c;修改 Hadoop 的配置文件&#xff08;/hadoop/hadoop-2.7.7/etc/hadoop 目录下&#xff09;2.1.2 启动集群2.1.3 查…

结构体成员访问操作符

1.结构体成员的直接访问&#xff1a; 结构体变量.成员名&#xff1a; 2.结构体成员的间接访问: 间接访问应用于指向结构体变量的指针&#xff1a;如下

提升零售行业竞争力的信息抽取技术应用与实践

一、引言 在当今快速发展的零售行业中&#xff0c;沃尔玛、家乐福等大型连锁超市为消费者提供了丰富的日常食品和日用品。为了进一步提升客户体验和优化库存管理&#xff0c;这些零售巨头纷纷开始探索和应用先进的信息抽取技术。 本文将深入探讨一个成功的信息抽取项目&#…

【Android】工厂测试中 局部 字体显示重叠 问题分析与解决(Android14)

继上一篇【Android】工厂模式中 字体大小/显示重叠/显示不完整 相关 问题分析与解决 的分析与解决&#xff0c;可以实现调整所有字符整体的宽高。 但在局部&#xff0c;如果只希望修改局部的某一行字符的样式&#xff0c;且这一行字符没有直接的资源布局控制文件&#xff0c;而…

linux——进程(1)

目录 一、概念 1.1、认识进程 1.2、进程描述符&#xff08;PCB&#xff09; 1.3、进程的结构体&#xff08;task_struct&#xff09; 二、查看进程 三、获取进程的Pid和PPid 3.1、通过系统调用获取进程的PID和PPID 四、创建进程 4.1、fork() 4.2、用if进行分流 五、…

OSPF协议全面学习笔记

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 OSPF协议全面学习笔记 1、OSPF基础2、DR与BDR3、OSPF多区域4、虚链路Vlink5、OSPF报文6、LSA结构1、一类/二类LSA&#xff08;Router-LSA/Network-LSA&#xff09; 更新完善中... 1、…

移动端实现一个日历带提示

移动端实现一个日历带提示的效果&#xff1a; 功能&#xff1a;超过当前12点不能选明天的&#xff0c;只能选后天的日期。 使用组件&#xff1a;vant-Calendar const formatter (day: CalendarDayItem) > {// console.log("day", day);const currentTime new …

软考77-上午题-【面向对象技术3-设计模式】-创建型设计模式02

一、生成器模式 1-1、意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 1-2、结构图 Builder 为创建一个 Product 对象的各个部件指定抽象接口。ConcreteBuilder 实现 Builder 的接口以构造和装配该产品的各个部件&#xff0c;定…

Docker 安装部署MySQL教程

前言 Docker安装MySQL镜像以及启动容器&#xff0c;大致都是三步&#xff1a;查询镜像–>拉取镜像–>启动容器 1、查询镜像 docker search mysql2、拉取镜像 拉取镜像时选择stars值较高的 docker pull mysql:5.7 #这里指定拉取对应的版本Mysql5.7&#xff0c;没有指…

Linux网络基础2

目录 实现网络版本计算器 自己定协议实现用json协议实现 重谈OSI七层模型HTTP协议 域名介绍url介绍HTTP请求和响应 实现一个简易的HTTP服务器 实现简易Http服务器初级版实现简易Http服务器中级版 实现一个简易的HTTP服务器最终版 请求方法HTTP状态码HTTP常见的Header 实现网…

常见的实时操作系统(RTOS)(嵌入式和物联网操作系统)介绍

在嵌入式系统和物联网&#xff08;IoT&#xff09;设备中&#xff0c;实时操作系统&#xff08;RTOS&#xff09;是至关重要的&#xff0c;因为它们负责管理有限的硬件资源&#xff0c;并提供确保任务在特定时间内完成的机制。开源实时操作系统&#xff08;RTOS&#xff09;允许…

Java项目:60 ssm基于JSP的乡镇自来水收费系统+jsp

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统可以提供信息显示和相应服务&#xff0c; 其管理员管理水表&#xff0c;审核用户更换水表的请求&#xff0c;管理用户水费&#xff0c;包…

【04】WebAPI

WebAPI 和标准库不同,WebAPI 是浏览器提供的一套 API,用于操作浏览器窗口和界面 WebAPI 中包含两个部分: BOM:Browser Object Model,浏览器模型,提供和浏览器相关的操作DOM:Document Object Model,文档模型,提供和页面相关的操作BOM BOM 提供了一系列的对象和函数,…

3d导出stl格式模型破碎是什么原因,怎么解决?---模大狮模型网

在导出3D模型为STL格式时出现破碎(或称为碎片化)的情况通常是由于模型中存在几何上的问题造成的。以下是一些可能导致STL模型破碎的原因以及解决方法&#xff1a; 3d导出stl格式模型破碎的原因&#xff1a; 模型不封闭&#xff1a;STL格式要求模型必须是封闭的实体&#xff0c…

数字图像处理 使用C#进行图像处理九 实现傅里叶变换

一、简述 傅立叶变换将图像分解为其正弦和余弦分量。换句话说,它将图像从空间域变换到频率域。这个想法是任何函数都可以用无限正弦函数和余弦函数之和来精确近似。傅里叶变换是实现此目的的一种方法。 网上有很多关于傅里叶变换的文章,这里就不进行赘述了,这里主要结合代码…

Spring项目问题—前后端交互:Method Not Allowed

问题 前后端交互时出现Method Not Allowed问题 Ajax中使用的是get&#xff0c;方法仍然出现post方法报错 Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method POST not supported] 浏览器中没有报错&#xff0c;只是接收不到后端返…

监控微信的软件,什么软件可以监控微信聊天记录

有的老板会在后台发文&#xff1a; “能监控聊天记录么&#xff1f;” “聊天记录删除了能找回么” “监控聊天记录的安装包有吗” ...... 可见很多老板对员工的工作时的工作状态都不太放心。 针对监控微信这个事情&#xff0c;我们应该理性分析看待。 首先&#xff0c;需…