最短路径问题

news2024/11/20 20:21:08

目录

一、前言

二、算法讲解

1、Dijkstra--朴素算法:O(n * n)

2、Dijkstra--堆优化算法:O(mlogm)

3、Bellman_ford贝尔曼算法: O(n * m)

4、Spfa算法:O(n * m)

5、Spfa处理负环:O(n * m)

6、Floyd算法:O(n^3)


一、前言

        最短路问题变化很多,不同数据范围的变化,也会导致算法运用的不同,下面给大家总结了不同最短路问题,不同数据范围应该用怎样的方式去解决。

二、算法讲解

1、Dijkstra--朴素算法:O(n * n)

算法描述:

(1)初始化距离数组:dist[1] = 0, dist[i] = INF

(2)迭代n次,每次迭代确定一个min加入集合S(这里确定的min一定是上一次迭代所更新的所有邻边里的一条),n次迭代之后确定所有起点到所有点的最短距离

(3)将不在S集合中dist_min的点--->t

(4)t --->S

(5)用t更新到其他点的距离(相当于更新t的邻边)

算法简述:

简单来说,迭代后的效果就是利用每一次确定的一个点的最短距离,去更新他们的邻边的距离,n次迭代后,就确定了所有点到起点的最短距离。

适用范围:

适用于m >= n * n的无负权边的稠密图,用邻接矩阵存图。

代码实现: 

2、Dijkstra--堆优化算法:O(mlogm)

算法描述:

(1)利用优先队列,代替朴素算法中找最小值那一步

(2)优先队列中存放两个关键字 距离 和 起点

(3)每次取出堆顶元素,即所有待更新中距离的最小值

(4)更新前需要判断,该点是否已经确定过了最短距离,若确定了,则跳过,反之则进行更新操作

(5)更新后,再将所更新的邻边加入堆中

算法简述:

简单来说,每次遍历确定一个堆顶元素(所有边中的最短距离),利用已经确定了最短距离的点,去更新他们的邻边,将这些更新邻边放入队列中,直至堆中没有元素,即所有点到起点的最短距离已经确定

适用范围: 

适用于 n = m的无负权边的稀疏图,用邻接表存图。

 代码实现:

3、Bellman_ford贝尔曼算法: O(n * m)

算法描述:

(1)独特的存图方式  struct Edge{ int a, b, c;}edges[M];

(2)注意连锁想象需要备份

(3)初始化dist, 松弛dist[x.b] = min(dist[x.b], backup[x.a]+x.w);

(4)松弛k次,每次访问m条边

算法简述:

简单来说,经过k条边,循环k次,每次循环只会更新所有已经确定了的点的邻近的一条边,需要注意每一次循环利用上一次循环的结果,去更新本次循环的距离,所以需要备份

适用范围:

适用于有边数限制的最短路问题。

代码实现: 

4、Spfa算法:O(n * m)

算法描述:

(1)利用队列优化贝尔曼算法中松弛一步进行优化

(2)将修改过最短距离的点加入队列中,因为修改了该点,其出边点的最短距离会变化,需要重新更新

(3)更新队列中当前点的所有出边

算法简述: 

简单来说,就是将修改过了点,加入队列,用其重新更新其出边的点,直至队列中不存在值了,就说明所以点都找到了最短距离

适用范围:

n = m, 使用于存在负权边的稀疏图,用邻接表存

代码实现:

5、Spfa处理负环:O(n * m)

算法描述:

(1)若需要用来判断是否存在负环,则需要将所有的点都加入到队列中进行更新,因为可能起点1不在负环中

(2)在更新最短距离的同时,更新一下当前点的是第几次更新的结果,当前点的更新次数等于其入边的更新次数 + 1,即cnt[j] = cnt[t] + 1;

(3)判断当前点的更新次数有没有超过总点数n,超过了,说明有负权回路,即if (cnt[t] > n) return true;

算法简述: 

简单来说,就是遍历所有的点,计数第i个点的最短距离是第几次更新得到的结果,如果是第n + 1及以上次更新得到,说明存在负权回路。

代码实现:

 

6、Floyd算法:O(n^3)

算法描述:

(1)独特初始化dist方式,如果i == j,则令其dist = 0, 反之为 0x3f3f3f3f,这样可以处理自环问题,

(2)根据动态规划的思想,用三层循环更新dist

(3)循环k, i, j, dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);

算法简述: 

简单来说,就是三层循环,一个公式。

适用范围: 

适用于多源化求最短路,即给你多组(a, b), 让你求出a ---> b的最短路径

代码实现:

码字不易,留下双击和关注吧!

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

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

相关文章

iOS 列表页面实时刷新解决方案

iOS 列表页面实时刷新解决方案 一、背景介绍 1.1 问题的出现 客户要求APP客户端每次切换Tab,都需要从服务器去获取最新的数据,所以每次切换Tab,客户端都会去主动刷新接口,以获取最新的数据。但是实际发现,每次切换T…

基于FPGA MIPS CPU设计学习(1)

关于什么是MIPS以及MIPS架构可参考文章: MIPS架构与指令简介 1 MIPS寄存器学习 MIPS寄存器详细解释如下: • 0 : 即 0: 即 0:

【Shell 脚本速成】04、Shell 脚本格式化输出与用户交互

目录 一、shell格式化输出 1、echo命令 案例演示: 2、输出颜色字体 3、综合案例 二、 用户交互 1、read命令 2、交互输入案例 计算机程序其实就是三步:输入、运算、输出,这个理论也适应于shell编程。 那么计算机是如何将信息按照比较舒服的格式输…

Unity - BRP管线关闭 - UpdateDepthTexture的绘制

最近一直忙着跟项目打杂。。。 比较少时间进修,充电。。。难受香菇 但是 unity 的踩坑经验倒是增加了不少(还有很多坑的经验我都懒得写了,但是这些坑浪费查资料时间,还不如自己记下来,便于日后如果还有 BRP 项目的处理…

Neptune CHT-C助力零束打造智舱界王者

9月27日,上汽子品牌飞凡汽车的首款旗舰车型——飞凡R7刚一上市就牢牢吸引了众多视线,在了解了其配置后,用户纷纷称其为“智驾界卷王”。 飞凡R7搭载的RISING MAX 31巨幕,由中国品牌车型最大尺寸的43英寸宽幅真彩三联屏和全球首发量…

CSS的元素显示模式

元素显示模式是什么&#xff1f;&#xff1a; 由于网页中的标签非常多&#xff0c;在不同地方会用到不同类型的标签&#xff0c;了解他们的特点可以更好的布局我们的网页。 元素显示模式就是元素(标签)以什么方式进行显示&#xff0c;比如<div>独占一行&#xff0c;比如…

线索二叉树

目录 一、线索二叉树的类型定义 二、各种线索化的二叉树 三、中序线索二叉树的算法 完整代码&#xff1a; 一、线索二叉树的类型定义 typedef struct BTNode {ElemType data;//数据域struct BTNode* lchild;//左孩子或线索指针struct BTNode* rchild;//右孩子或线索指针int lt…

锐捷MPLS隧道单域实验配置

目录 配置AS100内的IGP路由协议 配置AS内的LDP 配置PE-PE的MP-BGP协议 在PE侧配置PE-CE的路由协议 在CE侧配置PE-CE的路由协议 将CE的路由重发布进MP-BGP中 将MP-BGP的路由重发布进CE中 MPLS隧道——单域基础理论讲解_静下心来敲木鱼的博客-CSDN博客_mpls隧道https://bl…

Python安装

一、官网下载 二、安装 找到下载的安装包&#xff0c;直接双击安装 三、设置环境变量 1、mac自带的python版本 2、修改为新下载的python3.11版本 1&#xff09;修改.bash_profile vi ~/.bash_profile 修改完成后&#xff0c;生效该文件&#xff1a;source ~/.bash_profile…

如何写出公众号爆文?分享你一份爆文写作秘籍

新媒体时代&#xff0c;想要产出一篇公众号爆文真的是难于上青天&#xff01;现在公众号内容同质化严重&#xff0c;如果你没有一些新颖的观点和真本事&#xff0c;是无法从成千上万的公众号中脱颖而出的&#xff01; 如何写出公众号爆文&#xff1f;为什么你看了那么多写作干货…

java--07 面向对象

altenter 文件名和public名保持一致 两个变量指向同一个对象的内存图&#xff1a;如果被一个对象更改 &#xff0c;另外一个对象跟着更改 垃圾回收机制&#xff1a; altenter &#xff1a;添加方法 ctraltt:添加循环 构造器 this关键字 ​​​​​​​ 封装&#x…

周志华机器学习(6):支持向量机

周志华机器学习&#xff08;6&#xff09;&#xff1a;支持向量机6 支持向量机6.1 间隔与支持向量6.2 对偶问题&#xff08;dual problem&#xff09;6.3 核函数6.4 软间隔与正则化基本是大段摘录加上一些自己的补充&#xff0c;去除了冗余的话。6 支持向量机 6.1 间隔与支持向…

实体店应该围绕什么核心来打造自己体系多模式多平台的生态

大家好&#xff0c;我是阿璋&#xff0c;阿璋时不时会发布一些创新的电商资讯&#xff0c;经过电商与疫情的反复摧残&#xff0c;实体商家的收益大不如从前&#xff0c;营业额一跌再跌&#xff0c;迎来实体寒潮&#xff0c;本期给大家分享一个实体店结合共享消费积分联盟广告生…

封神之作,超火Java面试突击手册,进大厂真的就这么简单?

2022年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套完整的java后端学习路线以及1000道的Java面试手册我整理了整整1个月&#xff0c;上传到Git上目前star数达到了30K …

MCE | 阿尔兹海默症发病机制

阿尔兹海默症 (Alzheimers Disease, AD)&#xff0c;俗语常说的“老年痴呆症”&#xff0c;在奥斯卡提名短片《勿忘我》中以动画形式展现出了阿尔兹海默症患者的世界&#xff0c;动画中的老人&#xff0c;逐渐失去自己的记忆&#xff0c;甚至忘记最爱的人&#xff0c;他的脑海中…

学习软件测试需要注意的几点

⒈ 测试主页技能掌握 关于软件测试&#xff0c;所需要的专业技能&#xff1a; l 基础测试技术&#xff1a;黑盒测试、白盒测试、测试用例设计等; l 软件测试方法&#xff1a;单元测试、功能测试、集成测试、系统测试、性能测试; l 软件测试知识&#xff1a;基础的测试流程管理、…

孩子没有感统失调的表现,还有必要做感统训练吗?

孩子没有感统失调表现&#xff0c;是不是就可以放心了&#xff1f; 孩子训练一段时间&#xff0c;进步非常大&#xff0c;是不是就不需要再继续做训练了&#xff1f; 答案是&#xff1a;无论孩子能力发展如何&#xff0c;感统训练都必不可少。 为什么每个孩子都需要感统训练…

Git——IDEA集成GitHub详细操作

目录 一、 设置GitHub账号 二、分享项目到GitHub 三、push推送本地库到远程库 3.1 第一种方法&#xff1a; 3.2 第二种方法&#xff1a;SSH 四、pull拉取远程库到本地库 五、clone克隆远程库到本地 一、 设置GitHub账号 可以使用下面这个token登录&#xff0c;第一个太慢太慢…

CodeBlocks C++开发环境的配置及使用

CodeBlocks C开发环境的配置及使用 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本文不允许以纸质及电子出版为目的进行抄摘或改编。 1.《Python编程基础及应用》&#x…

前端开发性能优化方案-14条

1、减少http请求数量。 单独得一个图片&#xff0c;js,css都是一个请求&#xff0c;将同类合并可以有效得减少请求个数。 2、使用CDN(内容分发网络) 需要新增服务器减少请求得站点个数&#xff08;靠钱解决需要买服务器&#xff09;。 3、添加Expire/Cache-Control头 Expi…