最短路径算法

1. Dijkstra算法

在正数权重的有向图中求解某个源点到其余各个顶点的最短路径一般可以采用迪杰斯特拉算法(Dijkstra算法)。

1.1 适用场景

  • 单源最短路径
  • 权重都为正

1.2 伪代码

在这里插入图片描述

1.3 示例

问题描述: 计算节点0节点4的最短路径,图路径如下:
在这里插入图片描述
step1: 采用二维表记录0点到其他节点的距离,第一列距离初始化为 ∞ \infty ,第二列记录到达每个节点时,该节点前面的点,主要用于最短路径回溯。
在这里插入图片描述
step2: 0到0的距离是0,为最优路径,标记为对勾,节点0到节点1、7的距离分别为4、8,节点1、7前面的点为节点0,所以在前面点填写0。
在这里插入图片描述
step3: 在未标记的点中选取最小值,最小值为4,对应的节点为1,将其标记为最优路径,标记为对勾,计算最小值节点1的邻居节点。
在这里插入图片描述
经过最小值节点1可以到达邻居节点2、7,到节点2的距离是 4 + 8 = 12 < ∞ 4+8=12<\infty 4+8=12<,所以更新节点2的距离为12,到达节点2时,经过的前面节点为节点1。
经过最小值节点1到达节点7的距离 4 + 11 = 15 > 8 4+11=15>8 4+11=15>8,所以不更新节点7,节点7前面的节点仍为节点0。
step4: 在剩余未标记的点中选取最小值,最小值为8,对应的节点为7,将其标记为最优路径,标记为对勾,计算最小值节点7的邻居节点。
在这里插入图片描述
更新节点6、8,节点6的距离8(节点7的最短距离)+1=9和节点8的距离8(节点7的最短距离)+7=15,前面的节点都为7。以此类推,更新所有的节点。
在这里插入图片描述
最后0到所有节点的最短近距离如下:
在这里插入图片描述
step5: 节点0到节点4的最短距离为21,节点4的前面节点为节点5, 5 → 4 5 \rightarrow 4 54,节点5前面的节点是节点6, 6 → 5 6 \rightarrow5 65, 节点6前面是节点7, 7 → 6 7\rightarrow6 76,节点7前面是节点0, 0 → 7 0\rightarrow7 07,综上所述,最短路径为: 0 → 7 → 6 → 5 → 4 0 \rightarrow 7 \rightarrow6 \rightarrow 5 \rightarrow 4 07654,距离为21。

2. Bellman-Ford算法

Bellman-ford算法适用于单源最短路径,图中边的权重可为负数即负权边,但不可以出现负权环。

2.1 适用场景

  • 单源最短路径
  • 边的权重可为负数即负权边
  • 不可以出现负权环

2.2 伪代码

在这里插入图片描述

2.4 示例

step1: 初始图如下,箭头上的数字表示权重,括号内容含义为:(前面节点,距离),除去源点,其他点的初始距离为 ∞ \infty 1 ◯ − 7 ◯ \textcircled{1}-\textcircled{7} 17表示边的编号。接下来,从节点0到节点n-1开始遍历。
在这里插入图片描述
step2:节点0出发:更新所有节点的权重,节点 0 → 1 0 \rightarrow 1 01为90, 0 → 4 0 \rightarrow 4 04为75, 0 → 3 0 \rightarrow 3 03为80,它们的距离都小于 ∞ \infty ,到达节点的上一个节点都是节点0,更新为(0,距离)。
在这里插入图片描述

step3:节点1出发, 0 → 1 → 2 0 \rightarrow 1 \rightarrow 2 012 90 − 30 = 60 < ∞ 90-30=60<\infty 9030=60<, 由于节点2上一个节点是节点1,所以标记为(1,60)。
在这里插入图片描述
step3:节点2出发,60+10<75,节点4更新为(2,70)
在这里插入图片描述
step4:节点3出发,80-30=50<60,更新节点2为(3,50)。80+10=90>70,无需更新节点4。
在这里插入图片描述
step4:节点4出发,不存在边,无需更新,完成第一遍所有的松弛操作。

step5: 进行第二轮遍历,由于节点 2 → 4 2 \rightarrow 4 24 的和50+10=60<70,更新节点4为(2,60)。
在这里插入图片描述

step6: 第三遍遍历没有任何松弛操作,且3<=n-1=4,说明不存在负权重的环,可以直接返回节点0到其他节点的距离。如果存在松弛操作,最多进行n-1轮遍历,如果第n轮还存在松弛操作,说明存在负权重的环。
最短路径如下图红框所示:
在这里插入图片描述

如果存在负环,示例如下:
在这里插入图片描述
节点2、3、4存在负环,负环会导致无穷迭代。
第1遍遍历结果
在这里插入图片描述
更新节点4为(2,60)
在这里插入图片描述
更新节点3为(4,70)
在这里插入图片描述
更新节点2为(3,40),以此类推,导致无穷迭代。
在这里插入图片描述

3 Floyd算法(待完善)

4 算法特点对比(待完善)

Dijkstra 与Bellmon-ford
(1)Dijkstra为贪心算法,Bellmon-Ford算法不是贪心算法
(2)Dijkstra在有负权的情况下无法工作,Bellmon-Ford算法允许有负权。
(3)Bellmon-Ford算法可以用来判定是否有负权环。
(4)从计算复杂度角度分析,单节点算法首选Dijkstra算法的,它的计算复杂度为 O ( n 2 ) O(n^2) O(n2)

参考资料:
https://blog.csdn.net/weixin_41806489/article/details/126852955
https://www.bilibili.com/video/BV1zz4y1m7Nq
https://www.bilibili.com/video/BV18a4y1A7gv

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arduino uno R3驱动直流减速电机(蓝牙控制)

此篇博客用于记录使用arduino驱动直流减速电机的过程&#xff0c;仅实现简单的功能&#xff1a;PID调速、蓝牙控制 1、直流减速电机简介2、DRV8833电机驱动模块简介3、HC-05蓝牙模块简介电机转动测试4、PID控制5、蓝牙控制电机 1、直流减速电机简介 我在淘宝购买的电机&#x…

C语言整型数据类型..

1.整型数据类型 在C语言中 根据数据范围从小到大依次为char、short、int、long、long long 但是对于整型来说 为什么有这么多类型呢 我们得先说字节的本质&#xff1a; 计算机是通过晶体管的开关状态来记录数据 晶体管通常8个为一组 称为一个字节 而晶体管由两种状态 分别是开…

交叉熵损失函数(Cross-Entropy Loss)的基本概念与程序代码

交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;是机器学习和深度学习中常用的损失函数之一&#xff0c;用于分类问题。其基本概念如下&#xff1a; 1. 基本解释&#xff1a; 交叉熵损失函数衡量了模型预测的概率分布与真实概率分布之间的差异。在分类问题中&…

春节假期:思考新一年的发展思路

春节假期是人们放松身心、享受家庭团聚的时刻&#xff0c;但除了走亲戚、玩、吃之外&#xff0c;我们确实也需要思考新的一年的发展思路。以下是一些建议&#xff0c;帮助您在春节假期中为新的一年做好准备&#xff1a; 回顾过去&#xff0c;总结经验&#xff1a;在春节期间&a…

大华智慧园区综合管理平台/emap/devicePoint RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【十六】【C++】stack的常见用法和练习

stack的常见用法 C标准库中的stack是一种容器适配器&#xff0c;它提供了后进先出&#xff08;Last In First Out, LIFO&#xff09;的数据结构。stack使用一个底层容器进行封装&#xff0c;如deque、vector或list&#xff0c;但只允许从一端&#xff08;顶部&#xff09;进行…

一周学会Django5 Python Web开发-Django5操作命令

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

第8讲个人中心页面搭建实现

个人中心页面搭建实现 <template><view class"user_center"><!-- 用户信息开始 --><view class"user_info_wrap"><!--获取头像--><button class"user_image"></button> <view class"user_n…

14.盔甲?装甲?装饰者模式!

人类的军工发展史就是一场矛与盾的追逐&#xff0c;矛利则盾坚&#xff0c;盾愈坚则矛愈利。在传统的冶金工艺下&#xff0c;更坚固的盾牌和盔甲往往意味着更迟缓笨重的运动能力和更高昂的移动成本。从战国末期的魏武卒、秦锐士&#xff0c;到两宋之交的铁浮图、重步兵&#xf…

Roop的安装教程

roop插件的安装&#xff0c;并不容易 并且最好就是在电脑本地完成&#xff0c;因为涉及到C、visual studio软件&#xff0c;并且还需要在电脑本地放置一些模型&#xff0c;用autoDL其实也有镜像&#xff0c;但是需要数据扩容至少100G&#xff0c;烧钱。。。 电脑本地&#xff0…

javaweb物业管理系统jsp项目

文章目录 物业管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 物业管理系统 可用作javaweb项目、servlet项目、jsp项目的项目设计 一、系统演示 物业管理系统 二、项目介绍 语言&a…

ChatGPT高效提问—prompt常见用法(续篇)

ChatGPT高效提问—prompt常见用法&#xff08;续篇&#xff09; ​ 对话式prompt适用于模拟各种交流情境。若我们意图探索在特殊场合下可能出现的对话情景&#xff0c;或者模拟一段对话流程&#xff0c;可以采用这种方法&#xff0c;通过精准的prompt指令&#xff0c;引导Chat…

多视图特征学习 Multi-view Feature Learning既可以被看作是一种学习框架,也可以被看作是一种具体的学习算法!

Multi-view Feature Learning 1.多视图特征学习Multi-view Feature Learning的基本介绍总结 1.多视图特征学习Multi-view Feature Learning的基本介绍 多视图特征学习是一种利用多视图数据集来进行联合学习的机器学习方法。多视图数据指的是对同一事物从多种不同的途径或角度进…

监测Nginx访问日志502情况后并做相应动作

今天带大家写一个比较实用的脚本哈 原理&#xff1a; 假设服务器环境为lnmp&#xff0c;近期访问经常出现502现象&#xff0c;且502错误在重启php-fpm服务后消失&#xff0c;因此需要编写监控脚本&#xff0c;一旦出现502&#xff0c;则自动重启php-fpm服务 场景&#xff1a; 1…

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装&#xff0c;我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在&#xff0c;只需要使用哈尔特征检测得到人脸在图像中的位置&#xff0c;再指示舵机运…

C++内联函数深入讲解

用法&#xff1a; 在函数的返回值前面加上inline&#xff0c;例如&#xff1a; 作用&#xff1a; 内联函数的存在其实是为了解决c语言中一些问题&#xff0c;比如有一个频繁调用的小函数&#xff0c;每次调用都需要建立栈帧&#xff0c;压栈出栈&#xff0c;减少了效率&#xf…

【复现】litemall商场系统后台弱口令漏洞_47

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 litemall是一个简单的商场系统&#xff0c;基于现有的开源项目&#xff0c;重新实现一个完整的前后端项目&#xff0c;包含小程序…

单链表基础知识点

单链表的读取 对于单链表实现获取第i个元素的数据的操作 GetElem&#xff0c;在算法上&#xff0c;相对要麻烦一些。 获得链表第i个数据的算法思路: 声明一个结点p指向链表第一个结点&#xff0c;初始化j从1开始;当j<i时&#xff0c;就遍历链表&#xff0c;让p的指针向后移…

如何通过ETL实现快速同步美团订单信息

一、美团外卖现状 美团作为中国领先的生活服务电子商务平台&#xff0c;其旗下的美团外卖每天承载着大量的订单信息。这些订单信息需要及时入库、清洗和同步&#xff0c;但由于数据量庞大且来源多样化&#xff0c;传统的手动处理方式效率低下&#xff0c;容易出错。比如&#…

嵌入式中详解 ARM 几个常见的寄存器方法

大家好&#xff0c;今天来聊聊对于ARM几个特殊寄存器的理解&#xff0c;FP、SP和LR。 1、介绍 FP&#xff1a;栈顶指针&#xff0c;指向一个栈帧的顶部&#xff0c;当函数发生跳转时&#xff0c;会记录当时的栈的起始位置。 SP&#xff1a;栈指针&#xff08;也称为栈底指针&…