首页 > 编程语言 >最短路----Dijkstra算法详解

最短路----Dijkstra算法详解

时间:2024-12-14 22:03:45浏览次数:5  
标签:dist 短路 距离 ---- Dijkstra visited false true 节点

简介

迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格·迪科斯彻(Edsger Dijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。适用的是单源路径最短路问题,对于多源则采用弗洛伊德(Floyd)算法

Dijkstra算法原理

  1. 初始化

    • 创建一个距离数组dist,用来存储从起始节点到每个节点的最短距离,初始时将起始节点的距离设为0,其余节点设为无穷大。
    • 创建一个优先队列(通常使用最小堆)来存储待处理的节点,初始时将起始节点加入队列。
  2. 处理节点

    • 从优先队列中取出距离最小的节点,标记为已处理。
    • 对于该节点的每个邻接节点,计算从起始节点到该邻接节点的距离。如果这个距离小于当前记录的距离,则更新距离并将该邻接节点加入优先队列。
  3. 重复

    • 重复步骤2,直到优先队列为空,或者所有节点都被处理。

如果还看不明白,请看下图

举个栗子
示例图

图的邻接表表示
  • 节点0到节点1的边权重为1
  • 节点0到节点2的边权重为4
  • 节点1到节点2的边权重为2
  • 节点1到节点3的边权重为5
  • 节点2到节点4的边权重为1
  • 节点4到节点3的边权重为1
Dijkstra算法执行过程

假设我们从节点0开始,以下是distvisited数组在每一步的变化:

  1. 初始化

    • dist = [0, ∞, ∞, ∞, ∞] (从起始节点0到其他节点的距离)
    • visited = [false, false, false, false, false] (所有节点未被访问)
  2. 处理节点0

    • 当前节点:0
    • 更新邻接节点1和2:
      • dist[1] = 1(0到1的距离)
      • dist[2] = 4(0到2的距离)
    • 更新后的数组:
      • dist = [0, 1, 4, ∞, ∞]
      • visited = [true, false, false, false, false]
  3. 处理节点1(下一个最小距离的节点):

    • 当前节点:1
    • 更新邻接节点2和3:
      • dist[2] = min(4, 1 + 2) = 3(更新0到2的距离)
      • dist[3] = 1 + 5 = 6(更新0到3的距离)
    • 更新后的数组:
      • dist = [0, 1, 3, 6, ∞]
      • visited = [true, true, false, false, false]
  4. 处理节点2

    • 当前节点:2
    • 更新邻接节点4:
      • dist[4] = min(∞, 3 + 1) = 4(更新0到4的距离)
    • 更新后的数组:
      • dist = [0, 1, 3, 6, 4]
      • visited = [true, true, true, false, false]
  5. 处理节点4

    • 当前节点:4
    • 更新邻接节点3:
      • dist[3] = min(6, 4 + 1) = 5(更新0到3的距离)
    • 更新后的数组:
      • dist = [0, 1, 3, 5, 4]
      • visited = [true, true, true, false, true]
  6. 处理节点3

    • 当前节点:3
    • 由于3没有未访问的邻接节点,算法结束。
    • 最终的dist数组为:
      • dist = [0, 1, 3, 5, 4](从节点0到各个节点的最短距离)
    • visited数组为:
      • visited = [true, true, true, true, true](所有节点均已访问)
最终结果
  • 从节点0到节点1的最短距离是1
  • 从节点0到节点2的最短距离是3
  • 从节点0到节点3的最短距离是5
  • 从节点0到节点4的最短距离是4

这个过程展示了Dijkstra算法如何逐步更新每个节点的最短路径,并标记已访问的节点。

代码实现

#include<iostream>
using namespace std;
int n,e,s;//n个顶点,e条边,s是起点
int dis[101];//dis[i]起点到i的最短距离
int vis[101];//标记是否找到
int edge[101][101];//记录路径i->j有路径
int main()
{
	cin>>n>>e;
	for(int i=1;i<=n;i++)
	{
		dis[i]=100000;
	}
	for(int i=1;i<=e;i++)
	{//邻接矩阵存储
		int a,b,c;
		cin>>a>>b>>c;
		edge[a][b]=c;
	}
	cin>>s;
	dis[s]=0;//起点到起点不需要代价
	for(int i=1;i<=n;i++)
	{
		int minn=inf,minx;
		for(int j=1;j<=n;j++)
		{
			if(dis[j]<minn&&vis[j]==0)
			{//寻找此点到其他点的最小距离
				minn=dis[j];
				minx=j;
			}
		}
		vis[minx]=1;//标记到达的最小点
		for(int j=1;j<=n;j++)
		{
			if(edge[minx][j]>0)//有边的话 
			{
				if(minn+edge[minx][j]<dis[j])
				{
					dis[j]=minn+edge[minx][j];//更新以最小距离点最为中转点的最小距离
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
	{//打印最短距离
		cout<<dis[i]<<" ";
	}
	return 0;
}

标签:dist,短路,距离,----,Dijkstra,visited,false,true,节点
From: https://blog.csdn.net/Lucas55555555/article/details/144476924

相关文章

  • Electron + React + Monaco Editor + AI 本地代码编辑器实现分析
    1.项目概述1.1核心技术栈前端框架:React编辑器引擎:MonacoEditor桌面框架:ElectronAI模型:Ollama(本地部署)Qwen(通义千问)1.2主要特性本地化AI编程助手多语言代码编辑实时代码补全智能文档生成2.AI模型集成2.1模型对比特性OllamaQwen部署方式纯本地本地/云端......
  • 怎么高效分享图片、超链接?
    在如今这个信息爆炸的时代,我们每天都需要分享各种内容——从超链接到图片,再到活动链接。我们可能会发现,想要在微信、微博、邮件、论坛等平台上分享信息时,往往需要不断复制粘贴、切换页面,搞得自己和接收者都很迷糊,既浪费时间又容易出错。然而,现在有一个超级简单的解决方案——D......
  • 数据安全的落实规则
    目录覆盖数据全生命周期的安全体系存储安全方案数据使用安全方案传输安全方案共享&流通安全方案销毁安全方案隐私数据的安全保护闭环  来源:“云智一体”技术与应用解析系列白皮书延伸阅读覆盖数据全生命周期的安全体系  数据全生命周期包括采集合规性检......
  • 干货必备:零散链接收纳攻略,打造爆款图文宣传页面
       在这个信息如潮水般涌来的时代,我们手头往往攥着大把的链接,各类精彩文章、趣味视频、实用文档琳琅满目。可每次分享时,逐个发送是不是让你不胜其烦?要是能把这些宝贝链接一股脑儿整合进一个专属链接,再用精美的图文精心装点出一个超吸睛的宣传页面,那简直爽翻!今天咱就来好好......
  • 运维必备--生产环境系统更新时必用的md5校验
    在生产环境下做更新的时候,为了不必要的扯皮以及更新的严谨性,一致性。更新前后需要md5文件校验。1.开发传代码包过来让他做好校验,更新包连同md5文件一起发送。2.运维接收代码包做一次文件校验,生成的md5文件跟开发提供的做对比,一致则没问题。3.更新到服务器后,再做一次文件的校......
  • 【软件工程】第五章·设计体系结构
    ......
  • MySQL中这14个神仙功能,惊艳到我了!!!
    大家好,我是苏三,又跟大家见面了。前言我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat在我们平常的工作中,使用groupby进行分组的场景,是非常多的。比如想统计出用户表中,名称不同的用户的具体名称有哪些?......
  • [超表面论文快讯-9] Advanced Functional Materials-近-远场可切换超表面-河南工业大
    栏目介绍:“论文快讯”栏目旨在精简地分享一周内发表在高水平期刊上的Metasurface领域研究成果,帮助读者及时了解领域前沿动态,如果对专栏的写法或内容有什么建议欢迎留言,后续会陆续开启其他专栏,敬请期待。论文基本信息标题:NonvolatileSwitchableJanusMetasurfacefo......
  • 基于UI交互意图理解的异常检测方法15
      1.背景近年来,随着美团多种业务线的扩充和迭代,UI测试的任务愈发繁重。针对UI测试中人工成本过高的问题,美团到店测试团队开发了视觉自动化工具以进行UI界面的静态回归检查。然而,对于UI交互功能逻辑的检验仍强依赖于脚本测试,其无法满足对于进一步效率、覆盖面提升的强烈需求......
  • 基于FPGA的数字电子秤设计(verilog)
    目录一、功能描述二、顶层设计分析2.1I2c_ctrl模块2.2PCF8591_ad模块 2.3v_weigh电压转质量模块2.4weighing_pre去皮模块2.5mcx计价模块2.6money价格输出模块2.7chose数码管选择显示模块2.8sign_give信号提供模块2.9buffer报警模块2.10顶层设计......