数据结构-最短路径(Dijkstra算法与Floyd算法)

介绍

对于网图来说,最短路径是指两顶点之间经过的边上权值之和最少的路径,其路径上第一个点记为源点,最后一个为终点。

计算最短路径有两个经典算法,即迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法。

Dijkstra算法

这个算法是从一个给定的顶点出发,不断计算更新此顶点到目标顶点的最短路径

假如有这样一张网图

如果我们要求顶点0到顶点1的最短距离,那无疑是1。由于1还与2,3相连,所以我们也可以求出0->1->2的距离为1+2=3,0->1->3距离为1+4=5;

但如果求从顶点0到顶点2的最短距离,由于边上都有权值,5是大于3的,所以0到2的最短距离是3;

同时,因为2与3,4相连,我们可以求得由此路径的0->1->2->3=3+1=4,0->1->2->4的距离为4+4=7;而这条路径上0到3的距离要小于上述0->1->3那条,则目前0到3的最短距离更新为4

... ...以此类推,不断基于已经求出的中途的最短距离,来更新到目标顶点的最短路径,这就是这个算法的核心思想

具体代码实现

	typedef struct{int vex[max];//顶点数组int arc[max][max];//带权边长int numN,numE;//顶点数及边数
}Mgraph;//用邻接矩阵存储整张图
int p[max];//储存最短路径下标数组
int d[max];//储存到各点的最短路径权值和
void SPDijkstra(Mgraph g,int v0){//传入图与起始顶点int m;int final[max];//记录从v0到i顶点的最短路径for (int i=0;i<g.numN;i++){final[i]=0;//初始化未未知最短路径的状态d[i]=g.arc[v0][i];//将所有与v0有连线的加上权值p[i]=-1;//初始化路径数组为-1}d[v0]=0;//v0至v0距离为0final[v0]=1;//标记v0至v0不需要求路径int k;for (int i=1;i<g.numN;i++){//从v1开始找起m=INT_MAX;for (int j=0;j<g.numN;j++){if (!final[j]&&d[j]<m){m=d[j];k=j;//记录距v0最短的带权路径顶点}}final[k]=1;//标记此顶点//开始更新最短距离for (int j=0;j<g.numN;j++){if (!final[j]&&m+g.arc[k][j]<d[j]){d[j]=m+g.arc[k][j];//更新v0到j的最短路径p[j]=k;//v0到j顶点的最短路径前驱是k}}}
}

Floyd算法

还是以此图为例

弗洛伊德算法常用于求取所有顶点至所有顶点的最短路径,它利用动态规划的方法,将顶点至顶点间的最短路径记录在一个二维数组中

在带权的邻接矩阵中,arc[i][j]记录的为i j之间的距离,如例图中arc[0][2]=5

但如果找一个与两个顶点都相连的中间节点,如1,计算得出arc[0][1]+arc[1][2]=1+2=3,这个值是小于5的,这条路径的距离就可以更新到矩阵中代替5的位置

利用这种算法进行重复迭代,对于每一对顶点i,j,遍历所有的中间节点k,检查是否存在一条路径比当前更短,如果是则更新矩阵中的最短距离。这样就可以的出两个个顶点之间的最短路径与最短距离。

代码实现如下

int p[max][max];//p数组记录路径,方便后续输出最短路径
int d[max][max];//记录最短距离
void SPFloyd(Mgraph g){for (int i=0;i<g.numN;i++){for (int j=0;j<g.numN;j++){d[i][j]=g.arc[i][j];//初始化为邻接矩阵p[i][j]=j;//初始化路径数组}}for(int k=0;k<g.numN;k++){for (int i=0;i<g.numN;i++){for (int j=0;j<g.numN;j++){if(d[i][j]>d[i][k]+d[k][j]){d[i][j]=d[i][k]+d[k][j];//更新最短距离p[i][j]=p[i][k];//更新路径,即要到j的最短路径中,j之前一个顶点为k}}}}
}

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

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

相关文章

unity学习(20)——客户端与服务器合力完成注册功能(2)调试注册逻辑

接着上一节的问题&#xff0c;想办法升级成具备数据库功能的服务器&#xff0c;这个是必须的。 至少在初始化要学会把文件转换为session&#xff0c;新知识&#xff0c;有挑战的。 现在是从LoginHandler.cs跳到了AccountBiz.cs的create&#xff0c;跳度还是很大的。 create函…

oauthlib,一个强大的 Python 身份校验库!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 ​编辑 前言 什么是 OAuthLib&#xff1f; 安装 OAuthLib OAuthLib 的主要功能 OAuthLib 的用法 实现…

文案馆头像壁纸微信小程序源码【支持流量主】

文案馆头像壁纸微信小程序源码【支持流量主】 源码介绍&#xff1a;文案馆头像壁纸微信小程序源码是一款可以获取套图、头像、壁纸的小程序。小程序源码内置流量主功能 需求环境&#xff1a;微信小程序phpmysql 下载地址&#xff1a; https://www.changyouzuhao.cn/13453.ht…

【C语言】长篇详解,字符系列篇2-----受长度限制的字符串函数,字符串函数的使用和模拟实现【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本期系列为【【C语言】长篇详解&#xff0c;字符系列篇2-----“混杂”的字符串函数&#xff0c;字符串函数的使用和模拟实现【图文详解】&#xff0c;图文讲解各种字符串函数&#xff0c;带大家更深刻理解C语言中各种字符串函数的应用&#x…

即时设计是什么?

在过去的两年里&#xff0c;由于疫情的推动以及科学技术的不断进步&#xff0c;国内外协同办公室发展迅速。在市场的推动下&#xff0c;市场上出现了越来越多的协同办公软件&#xff0c;使工作场所的工作更加高效。 在设计领域&#xff0c;具有协同功能的软件市场似乎仍处于空…

记一个大坑: 树莓派上docker运行motioneye找不到摄像头

当在树莓派上执行这段命令后&#xff0c;将创建montioneye容器 docker run --name"motioneye" \-p 8765:8765 \--hostname"motioneye" \-v /etc/localtime:/etc/localtime:ro \-v /etc/motioneye:/etc/motioneye \-v /var/lib/motioneye:/var/lib/motione…

162基于matlab的多尺度和谱峭度算法对振动信号进行降噪处理

基于matlab的多尺度和谱峭度算法对振动信号进行降噪处理&#xff0c;选择信号峭度最大的频段进行滤波&#xff0c;输出多尺度谱峭度及降噪结果。程序已调通&#xff0c;可直接运行。 162 matlab 信号处理 多尺度谱峭度 (xiaohongshu.com)

用Windows桌面应用程序制作一个扫雷游戏

游戏介绍: 这段代码是一个简易版的扫雷游戏的主程序部分。游戏分为几个主要部分: **主函数 (main)**:负责整个游戏流程的控制。首先,它初始化了一个枚举类型的变量 input 用于存储玩家的选择。然后,进入一个循环,在这个循环中,它会显示游戏菜单,接收玩家的输入,并根…

mysql 2-1

添加数据 方式二 更新数据 删除数据 小结 计算列 数据类型 可选属性 适用场景 如何选择 浮点类型 存在精度问题 定点数介绍 BIT类型 日期与时间类型 YEAR类型 DATA类型 TIME类型 DATATIME TIMESTAMP 文本字符串类型 适用场景 TEXT类型

基于Springboot的校园求职招聘系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园求职招聘系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

Git基本操作(超详细)

文章目录 创建Git本地仓库配置Git配置命令查看是否配置成功重置配置 工作区、暂存区、版本库添加文件--场景一概述实例操作 查看.git文件添加文件--场景二修改文件版本回退撤销修改情况⼀&#xff1a;对于工作区的代码&#xff0c;还没有 add情况⼆&#xff1a;已经 add &#…

大白话说说redux

redux的3个重要概念 store 就是用来存放应用的各种状态的action 就是用来描述应用发生了什么动作的&#xff0c;注意理解他是对动作的描述reducer 就是用来处理应用的动作&#xff0c;并且决定怎么去更新应用存放在store里面的状态。 redux的3个原则 应用的所有状态存储为re…

BUGKU-WEB 源代码

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 你说啥就是啥&#xff1a;去源代码吧 相关工具 URL解码平台&#xff1a;https://www.iamwawa.cn/urldecode.html 解题步骤 随便输入试试 2. 看看源码 存在script&#xff1a; <script> …

Java学习--黑马SpringBoot3课程个人总结-2024-02-14

1.子路由 //定义路由关系 const routes[{ path: /login, component: LoginVue},{ path: /, component: LayoutVue,redirect:/article/manage,children:[{path:/article/category,component:ArticleCategoryVue},{path:/article/manage,component:ArticleManageVue},{path:/…

IO-day3

思维导图 1.使用fread和fwrite完成图片的拷贝。 2.使用read和write完成两个文件的拷贝。 3.将时间在文件中跑起来。

Mock.js

在开发后端的应用中&#xff0c;我们使用postman来测试接口&#xff0c;观察和验证前后端之间的数据传递是否正常。 在开发前端的应用中&#xff0c;我们使用Mock.js来模拟后端服务&#xff0c;以便进行前端业务逻辑的开发和测试&#xff08;以前使用json-server也很方便&#…

问题描述:在Windows下没有预装ninja工具

问题描述:在Windows下没有预装ninja工具 # WInR输入cmd回车进入命令行,执行以下命令查看版本信息 ninja --version没有预装ninja工具 解决方案&#xff1a;下载安装ninja 在windows下安装gitbash和python。 打开cmd在合适位置下载ninja源码&#xff1a; git clone https://g…

JavaWeb-JDBC-练习

一、环境准备 1、数据库表 tb_brand 2、实体类 Brand 最后注意使用get、set方法和toString 二、实现功能 1、查询所有数据 2、添加数据 3、根据id修改 4、根据id删除

AI新工具(20240219) Ollama Windows预览版;谷歌开源的人工智能文件类型识别系统; PopAi是您的个人人工智能工作空间

Ollama Windows preview - Ollama Windows预览版用户可以在本地创建和运行大语言模型&#xff0c;并且支持NVIDIA GPU和现代CPU指令集的硬件加速 Ollama发布了Windows预览版&#xff0c;使用户能够在原生的Windows环境中拉取、运行和创建大语言模型。该版本支持英伟达的GPU&am…

【初始消息队列】消息队列的各种类型

消息队列相关概念 什么是消息队列 MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中…