Dijkstra单源最短路朴素算法(空间优化)

news/2024/12/18 11:39:48/文章来源:https://www.cnblogs.com/dianman/p/18614485

Dijkstra单源最短路朴素算法(空间优化)

基于使用邻接表存储连接边的方法,可以有效的降低空间复杂度

稀疏图(边的数量远小于顶点数量平方的图)中,邻接矩阵会大量占用无用的内存,导致Re,我们采用邻接表的办法,只存储存在的边,减少无关占用。相反,在稠密图(边的数量接近顶点数的平方的图)中,邻接表会遍历一整条链,检索时间会大大增加(不做优化),我们就采取邻接矩阵的方法来存储,每次只需要通过下标快速检索

通过结构体和vector来构造边的链表

struct edge
{int v, w;//v表示连接到的节点,w表示边权重
};
vector<edge> e[10010];

插入边操作

void insert(int u, int v, int w) {e[u].push_back({ v,w });
}cin >> u >> v >> w;
insert(u, v, w);

然后是使用朴素的Dijkstra算法实现单源最短路

void dijkstra(int s) {memset(dis, 0x3f, sizeof dis);//初始化可以使用memset 0x3f 批量操作dis[s] = 0;//起始点被访问for (int i = 1; i <= n; i++) {int min_node = 0;//初始化for (int j = 1; j <= n; j++)//遍历所有点min_node = dis[j] < dis[min_node] && !vis[j] ? j : min_node;
//找未被访问过的点中的最近点,判断最小值if (!min_node) break;//如果没能找到,即min_node未更新,退出循环vis[min_node] = 1;//当前点已被访问过for (auto it = e[min_node].begin(); it != e[min_node].end(); it++)//迭代器遍历当前点的所有连通边dis[it->to] = min(dis[min_node] + it->wh, dis[it->to]);//更新最小值}
}

使用迭代器遍历时,需要通过箭头运算符 -> 来访问结构体的成员元素

for (auto it = e[min_node].begin(); it != e[min_node].end(); it++)dis[it->to] = min(dis[min_node] + it->wh, dis[it->to]);

同样也可使用C++11标准内的区间遍历

for (auto iter : e[min_node])dis[iter.to] = min(dis[min_node] + iter.wh, dis[iter.to]);

区间遍历的一般格式

for (dataType rangeVariable : array) 

dataType为需要遍历的数组的数据类型, rangeVariable为循环内范围变量的名称,该变量用来接收遍历元素的值array为需要遍历的数组名,区间遍历的范围变量只需要通过 . 就能访问结构的成员元素

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

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

相关文章

组件 画线渲染 拖尾

了解属性 挂载脚本 还可以设置开始颜色宽度结束颜色等补充

画线渲染 拖尾

了解属性 挂载脚本 补充

LLaMA (以LLaMA2为例,文末附加对比1 2 3 三个版本的变化)

一、背景 LLaMA 2 和 LLaMA2-Chat 参数规模:70亿、130亿和700亿 数据和训练规模: 上下文长度 训练资源 性能表现: 二、预训练 pretraining 1. 预训练数据训练语料来自公开课用的数据源,不包括Meta的产品或服务数据在2万亿个数据tokens上进行了训练对真实的数据源进行…

手把手教会你电脑端如何长截屏~

如果在电脑端想拿到这样的长截图,教你一个方法,不需要下载软件 首先需要先下载一个小插件 需要下载滚动截屏所需的插件 然后解压 zip 包 下载好插件后,对 .zip 包进行解压,解压后文件夹里面有个 .crx 后缀的离线安装包,大致如下图所示:打开扩展程序管理菜单 接下来,打开…

实时同步,精准执行!高效电商团队必备协作术

随着电商行业的迅猛发展,运营团队日常工作节奏变得愈发紧张。从上新规划、活动策划到商品数据分析、客服反馈跟进,各个环节的任务交接与流程协作逐渐成为团队效率的瓶颈。尤其是在多人并行的项目中,沟通不畅、文档版本混乱、任务分配模糊等问题层出不穷,稍有不慎,就可能导…

【运维自动化-作业平台】如何使用全局变量之命名空间类型?

命名空间类型的全局变量主要适用场景是同一批主机在多个步骤间需要传递独立的变量值,比如内网ip、hostame,每台主机都是不同的变量值。而字符串变量是全局针对所有主机所有步骤都是一样的变量值。实操演示 例:定义一个local_ip的命名空间变量,目标两台机器,然后添加两个执…

智改数转,物联网创业者有哪些商业机会?

《智改数转,物联网创业者有哪些商业机会》 在当前的数字化转型浪潮中,“智改数转”(智能化改造和数字化转型)已成为企业发展的新趋势。物联网(IoT)作为这一转型的核心技术之一,为创业者提供了丰富的商业机会。以下是物联网创业者可以把握的几个关键商业机会: 1. 设备制…

中小团队必备工具:如何用协同管理软件提高效率

一、中小团队面临的工作效率挑战 中小团队通常面临以下几个主要的工作效率问题: 1.1 资源有限,工作繁重 与大型企业相比,中小团队往往资源有限,人员紧张,团队成员往往需要身兼数职,处理多种任务。这种情况下,如何有效分配工作、确保每项任务顺利推进,就成为了管理的关键…

【原创】PREEMPT-RT中断线程化原理与中断线程优先级设置

本文介绍实时linux方案PREEMPT-RT提升系统实时性的机制之一--中断线程化,以及中断线程优先级如何配置,希望能对你有所帮助。PREEMPT-RT中断线程化与中断线程优先级设置 目录PREEMPT-RT中断线程化与中断线程优先级设置一、什么是中断线程化1. 普通Linux中断处理2. 实时性的不足…

NPM,可视化的Nginx管理工具

NPM,可视化的Nginx管理工具 前言 NPM,全称:Nginx Proxy Manager,是一款可视化的Nginx的管理工具。众所周知,Nginx的配置文件对于新手尤其是我这样的小白,还是很难上手配置的。虽然说现在可以使用AI,大大降低了理解,配置难度,但是可视化的配置仍然具有很大的优势,极大的…

汽车软件DevOps解决方案

经纬恒润汽车软件DevOps解决方案是专为现代汽车行业设计的一套集成化需求、开发、测试、部署、OTA与监控,旨在加速软件开发流程,提高软件质量和安全性,同时确保整个生命周期的高效性和灵活性。 经纬恒润汽车软件DevOps解决方案是专为现代汽车行业设计的一套集成化需求…

idea构建Build Project项目时一直卡在解析阶段解决办法

可能是内存不足,修改以下三个地方 1、help->Edit Custom VM Options-Xmx4096m 2、file->settings->Build,Execution,Deployment->Build Tools->Maven->Importing的VM options for importer写入参数-Xmx4096m3、file->settings->Build,Execution,Deplo…