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

news2024/10/4 0:28:21

介绍

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

计算最短路径有两个经典算法,即迪杰斯特拉(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距离为0
	final[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.coloradmin.cn/o/1457501.html

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

相关文章

蓝桥杯嵌入式STM32G431RBT6知识点(主观题部分)

目录 1 前置准备 1.1 Keil 1.1.1 编译器版本及微库 1.1.2 添加官方提供的LCD及I2C文件 1.2 CubeMX 1.2.1 时钟树 1.2.2 其他 1.2.3 明确CubeMX路径&#xff0c;放置芯片包 2 GPIO 2.1 实验1&#xff1a;LED1-LED8循环亮灭 ​编辑 2.2 实验2&#xff1a…

C#使用MiniExcel导入导出数据到Excel/CSV文件

MiniExcel简介 简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作&#xff0c;但这会导致内存消耗问题&#xff0c;MiniExcel 尝试以 Stream 角度写底层算法逻辑&#xff0c;能让原本1000多MB占用降低到几MB&#xff…

提取游戏音频文件.bnk

提取游戏音频文件.bnk 什么是.bnk准备Wwise-Unpacker工具使用Wwise-Unpacker工具总结 什么是.bnk .bnk其实是一种对音频的加密方式&#xff0c;一个.bnk文件中通常包含了多个语音文件&#xff0c;一般可以使用Wwise-Unpacker来解码.bnk格式文件 准备Wwise-Unpacker工具 Wwis…

视频基础学习一——色立体、三原色以及像素

文章目录 前言一、什么是颜色1.色立体特征2.色立体模型 二、三原色和色立体1.三原色(RGB)2.RGB颜色叠加 三、像素和三原色总结 前言 本文的目的是为了梳理音视频基础相关的知识&#xff0c;有很多做流媒体、音视频相关的研发对于音视频的根本原理是不清楚的。博主也是查阅了相…

Linux 内存top命令详解

通过top命令可以监控当前机器的内存实时使用情况&#xff0c;该命令的参数解释如下&#xff1a; 第一行 15:30:14 —— 当前系统时间 up 1167 days, 5:02 —— 系统已经运行的时长&#xff0c;格式为时:分 1 users ——当前有1个用户登录系统 load average: 0.00, 0.01, 0.05…

Code Composer Studio (CCS) - 全局搜索功能

Code Composer Studio [CCS] - 全局搜索功能 1. Ctrl H&#xff0c;全局搜索功能References 1. Ctrl H&#xff0c;全局搜索功能 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

小程序列表下拉刷新和加载更多

配置 在小程序的app.json中&#xff0c;检查window项目中是否已经加入了"enablePullDownRefresh": true&#xff0c;这个用来开启下拉刷新 "window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": &q…

winform实现最小化至系统托盘

NotifyIcon类介绍 NotifyIcon 是 .NET中的一个类&#xff0c;它用于在系统托盘中显示图标。这个类在 System.Windows.Forms 命名空间下。 使用 NotifyIcon 类&#xff0c;你可以在系统托盘中创建一个图标&#xff0c;当用户点击或右键点击这个图标时&#xff0c;可以触发一些事…

GA-kmedoid 遗传算法优化K-medoids聚类

遗传算法优化K-medoids聚类是一种结合了遗传算法和K-medoids聚类算法的优化方法。遗传算法是一种基于自然选择和遗传机制的随机优化算法&#xff0c;它通过模拟生物进化过程中的遗传、交叉、变异等操作来寻找问题的最优解。而K-medoids聚类算法是一种基于划分的聚类方法&#x…

微服务-微服务Nacos配置中心

1.1 配置中心架构 1.2 Config Client源码分析 配置中心核心接口ConfigService public class ConfigServerDemo {public static void main(String[] args) throws NacosException, InterruptedException {String serverAddr "localhost";String dataId "naco…

2024 年 7 项值得学习的高收入技能

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要7项高收入技能6 个职业目标示例1. 晋升领导职务2.成为思想领袖3.致力于个人发展4.转向新的职业道路5.体验职业稳定性6.制定职业目标 简述概要 2023年已过&#xff0c;2024年已来&#xff0c;陆陆续续开始了复工&am…

面试经典150题 -- 链表 (总结)

总的地址 : 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 c链表总结 : 链表总结 -- 《数据结构》-- c/c-CSDN博客 141 . 环形链表 详细题解参考 : 141 . 环形链表-CSDN博客 这里给出慢双指针的代码 : /*** Defini…

【JAVA WEB】JS的应用

目录 猜数字 预期效果 涉及接口预览 代码实现 表白墙 预期效果 代码实现 代办事项 预期效果 代码实现 猜数字 预期效果 涉及接口预览 //当我们要获得文本框上输入的内容&#xff0c;可以通过.value获取 let guess_text document.querySelector(.guess_num) guess_…

社交商业策略:揭秘Facebook Shops的成功之道

随着数字化时代的不断发展&#xff0c;社交媒体已经成为了商业活动的重要平台之一。在这个趋势下&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;不仅仅是人们交流互动的场所&#xff0c;更成为了商家开展电子商务的重要渠道。其中&#xff0c;Facebook Shops…

MySQL中SQL语句的执行流程(高频考点)

文章目录 前言SQL语句的执行流程查询语句的执行流程更新语句的执行流程 总结 前言 昨天跟大家讲了MySQL的基础架构&#xff08;链接&#xff1a;MySQL的基础架构&#xff09;&#xff0c;今天讲一讲我们的高频面试题MySQL中SQL语句的执行流程。 建议看完 MySQL的基础架构 再来…

flutter 文件上传组件和大文件分片上传

文件分片上传 资料 https://www.cnblogs.com/caijinglong/p/11558389.html 使用分段上传来上传和复制对象 - Amazon Simple Storage Service 因为公司使用的是亚马逊的s3桶 下面是查阅资料获得的 亚马逊s3桶的文件上传分片 分段上分为三个步骤&#xff1a;开始上传、上传对…

【漏洞复现-通达OA】通达OA WHERE_STR 存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA WHERE_STR存在前台SQL注入漏洞,攻击者可通过该漏洞获取数据库敏感信息。 二、影响版本 ●…

全网最详细的从0到1的turbo pnpm monorepo的前端工程化项目[vitePress篇]

全网最详细的从0到1的turbo pnpm monorepo的前端工程化项目[vitePress篇] 前言选型为什么选择VitePress安装VitePress运行优化默认UI使用自定义UI编辑自定义布局编写home页面组件编写page页面组件 结语 前言 一个好的工程化项目&#xff0c;必然有一个好的文档管理&#xff0c;…

【Go-Zero】goctl生成model层后报错Unresolved reference ‘ErrNotFound‘解决方案

【Go-Zero】goctl生成model层后报错Unresolved reference ErrNotFound’解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇goctl生成model层后报错Unresolved reference ErrNotFound’报错解决方案的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 大家好&#xff…

Sora 的工作原理

原文&#xff1a;How Sora Works (And What It Means) 作者&#xff1a; DAN SHIPPER OpenAI 的新型文本到视频模型为电影制作开启了新篇章 DALL-E 提供的插图。 让我们先明确一点&#xff0c;我们不会急急忙忙慌乱。我们不会预测乌托邦或预言灾难。我们要保持冷静并... 你…