搜索与图论——Dijkstra算法求最短路

最短路算法

稠密图与稀疏图

n为点数,m为边数。m远小于n的平方为稀疏图,m接近n的平方为稠密图。

稀疏图用邻接表存,稠密图用邻接矩阵存

朴素版dijkstra时间复杂度为O(n^2),对于稠密图可以ac,但遇到稀疏图时会TLE。

dijkstra函数实现步骤:

1、初始时,所有点都在圈内,所有点vis都=0,d[原点]=0,d[其他点]=+∞

2、从圈内选一个距离最小的点,打标记移除圈

3、对t的所有出边执行松弛操作(即尝试更新所有邻点的最小距离:dist[j] = min(dist[j],dist[t] + g[t][j]);)

4、重复第2、3步操作,知道圈内为空

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 510;int n,m;
int g[N][N]; //读入图,g[x][y] = s表示,该点为x,出边指向的点为y,边权为s
int dist[N]; //从一号点走到当前点的最短距离是多少
bool vis[N]; //当前点的最短距离是不是已经被确定了,确定了打上标记出圈int dijkstra(){memset(dist,0x3f,sizeof dist);dist[1] = 0;for(int i = 0;i < n - 1;i ++ ){int t = -1;/* 这个for循环就是找出距离原点最近的点,for循环遍历所有点,if判断该点要没走过且该点到原点的距离小于t点到原点的距离,将j赋值给t,这样就可以以此找到当前没有被打上标记且距离原点最近的点了 */for(int j = 1;j <= n;j ++ )if(!vis[j] && (t == -1 || dist[t] > dist[j])) t = j;vis[t] = true; //t点距原点的最短距离已被确定,打上标记出圈/* 现在找到t了,遍历一遍所有点,有一下几种情况1.j点和t点之间无连接,那么g[t][j]=0x3f3f3f3f,特别大,会被pass2.dist[j]<=dist[t]+g[t][j],源点到j点的距离,如果经过t后距离更长了,那么不考虑3.dist[j]<=dist[t]+g[t][j],源点到j点的距离,经过t点距离更短了,那么修改dist[j]的值 */for(int j = 1;j <= n;j ++ ){dist[j] = min(dist[j],dist[t] + g[t][j]);}}if(dist[n] == 0x3f3f3f3f) return -1;else return dist[n];
}int main(){cin >> n >> m;memset(g,0x3f,sizeof g);while(m -- ){int x,y,z;cin >> x >> y >> z;g[x][y] = min(g[x][y],z);}cout << dijkstra() << endl;return 0;
}

堆优化版dijkstra 时间复杂度O(mlogn)

dijkstra函数实现步骤:

1、初始化,{0,1}入队,d[1] = 0,d[其他点] = max

2、从队头弹出距离原点距离最小的点ver,若ver扩展过则跳过,否则打标记

3、对u的所有出边执行松弛操作,把{d[j],j}压入队列

4、重复2、3步操作,直到队列为空

#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>using namespace std;typedef pair<int,int> PII;const int N = 150010;int n,m;
int h[N],w[N],e[N],ne[N],idx;
int dist[N];
bool vis[N];int add(int a,int b,int c){e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx,idx ++ ;
}int dijkstra(){memset(dist,0x3f,sizeof dist);dist[1] = 0;priority_queue< PII,vector<PII>,greater<PII> > heap;heap.push({0,1});while(heap.size()){auto t = heap.top();heap.pop();int distance = t.first,ver = t.second;if(vis[ver]) continue;vis[ver] = true;for(int i = h[ver];i != -1;i = ne[i]){int j = e[i];if(dist[j] > dist[ver] + w[i]) {dist[j] = dist[ver] + w[i];heap.push({dist[j],j});}}}if (dist[n] == 0x3f3f3f3f) return -1;return dist[n];
}int main(){cin >> n >> m;memset(h,-1,sizeof h);while(m -- ){int x,y,z;cin >> x >> y >> z;add(x,y,z);}cout << dijkstra() << endl;return 0;
}

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

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

相关文章

Linux权限管理

文章目录 linux权限管理1.Linux权限的概念2.Linux权限管理2.1 文件访问者的分类&#xff08;人&#xff09;2.2 文件类型和访问权限&#xff08;事物属性&#xff09;2.2.1 文件类型2.2.2 基本权限 2.3文件权限值的表示方法2.3.1 字符表示方法2.3.2 八进制数值表示方法 2.4 文件…

PCB信号传输速度

对于常用的FR4材料&#xff0c;走线的信号传输速度大约为 6 in/ns&#xff0c;in为英寸&#xff0c;1in等于2.54cm。 什么叫长走线&#xff1f; 跟信号的上升时间、传输速度有关&#xff0c;很多信号完整性相关的书籍认为&#xff0c;信号传输过程中&#xff0c;例如信号从低…

JetBrains全家桶vmoptions配置文件(Ubuntu)

Android Studio&#xff1a; ~/.config/Google/AndroidStudioPreview2022.3/studio64.vmoptions 其他IDE&#xff1a; ~/.config/JetBrains/RustRover2023.3/rustrover64.vmoptions ~/.config/JetBrains/PyCharm2023.3/pycharm64.vmoptions ~/.config/JetBrains/GoLand2023.1…

Odoo销售订单模块中添加自定义按钮以下载选择的发货单

在Odoo的ERP系统中&#xff0c;销售订单和发货单是销售管理流程中的重要组成部分。为了提高工作效率&#xff0c;可以通过自定义按钮的方式&#xff0c;让用户能够方便地下载选择的发货单。本教程将详细介绍如何在销售订单列表视图中添加一个自定义按钮&#xff0c;并实现下载发…

CV领域 交叉注意力(Cross Attention)中QKV的含义理解

交叉注意力公式&#xff1a; 注意力的输入&#xff1a; &#xff08;1&#xff09;KV&#xff1a;图像的全局特征 &#xff08;2&#xff09;Q&#xff1a;告诉attention需要关注哪些重要特征 公式计算过程理解&#xff1a; &#xff08;1&#xff09;&#xff1a;Q和K相乘…

后疫情时代CS保研沉思录暨2023年个人保研经验贴

个人情况 正如古话所说&#xff0c;最适合你的才是最好的。因此这里先贴上个人基本情况&#xff0c;用作参考。 如果你的个人情况与我相近&#xff0c;则有更强的参考作用。如果情况相差较大&#xff0c;也可以姑且引为例子来研究。 学校层次&#xff1a;中流至末流211 专业…

C之易错注意点转义字符,sizeof,scanf,printf

目录 前言 一&#xff1a;转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 &#xff1a; 如果出现\890,\921这些的不是属于\ddd类型的&#xff0c;&#xff0c;不是一个字符…

springboot中基于RestTemplate 类 实现调用第三方API接口【POST版本】

https://blog.csdn.net/Drug_/article/details/135111675 这一篇的升级版 还是先配置文件 package com.init.config;import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.clie…

把本地文件上传到HDFS上操作步骤

因为条件有限&#xff0c;我这里以虚拟机centos为例 实验条件&#xff1a;我在虚拟机上创建了三台节点&#xff0c;部署了hadoop&#xff0c;把笔记本上的数据上传到hdfs中 数据打包上传到虚拟机节点上 采用的是rz命令&#xff0c;可以帮我们上传数据 没有的话可以使用命令安装…

Mybatis相关面试题详细总结

什么是MyBatis&#xff1f; MyBatis是一种开源的Java持久化框架&#xff0c;它通过XML或注解方式将对象与数据库表进行映射&#xff0c;提供了简单而强大的数据库访问功能。 MyBatis的优点是什么&#xff1f; 简单易用&#xff1a;MyBatis提供了直观的XML配置和注解&#xff0…

那个男人开发了一个多账号浏览器

核心价值1&#xff1a;实现了一个浏览器同时登录多个账号&#xff0c;标签页之间信息不共享核心价值2:聚焦于账号管理&#xff0c;所有需要登录多账号都用这个浏览器减轻了找入口的烦恼核心价值3:赏心悦目核心价值4:悬浮功能核心价值5:PC和手机模式一键切换核心价值6:不同于浏览…

Redis 全景图(1)--- 关于 Redis 的6大模块

这是我第一次尝试以长文的形式写一篇Redis的总结文章。这篇文章我想写很久了&#xff0c;只是一直碍于我对Redis的掌握没有那么的好&#xff0c;因此迟迟未动笔。这几天&#xff0c;我一直在看各种不同类型的Redis文章&#xff0c;通过阅读这些文章&#xff0c;引发了我对于Red…

DolphinScheduler on k8s 云原生部署实践

文章目录 前言利用Kubernetes技术云原生平台初始化迁移基于Argo CD添加GitOpsDolphinScheduler 在 k8s 上的服务自愈可观测性集成服务网格云原生工作流调度从HDFS升级到S3文件技术总结 前言 DolphinScheduler 的高效云原生部署模式&#xff0c;比原始部署模式节省了95%以上的人…

【论文通读】AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation

AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation 前言AbstractMotivationFrameworkConversable AgentsConversation Programming ApplicationA1: Math Problem SolvingA2: Retrieval-Augmented Code Generation and Question AnsweringA3: Decision…

相机标定学习记录

相机标定是计算机视觉和机器视觉领域中的一项基本技术&#xff0c;它的主要目的是通过获取相机的内部参数&#xff08;内参&#xff09;和外部参数&#xff08;外参&#xff09;&#xff0c;以及镜头畸变参数&#xff0c;建立起现实世界中的点与相机成像平面上对应像素点之间准…

zookeeper--ACL详解

一、ACL组成简介 &#xff08;Access Control List&#xff09; ACL 权限设置由scheme:expression, perms 三部分组成&#xff0c;分别代表了认证模式&#xff08;scheme&#xff09;、授权对象id、对应的权限&#xff1b; 1、认证模式&#xff08;scheme&#xff09; &…

android PKMS服务

前面我们介绍过Android AMS服务&#xff0c;今天我们看一下PKMS(PackageManagerService)服务&#xff0c;PKMS也是android系统中核心服务之一&#xff0c;负责应用程序的安装&#xff0c;卸载&#xff0c;信息查询等工作。 PKMS的启动 首先启动创建PKMS: private void start…

给网站添加安全措施 -- http -> https

快速上手 1、准备&#xff1a;腾讯云http域名、SSL证书、Nginx服务器。 2、在腾讯云平台内-我的域名&#xff0c;找到指定域名后添加解析映射IP。 3、腾讯云上搜索SSL证书&#xff0c;然后申请免费证书&#xff08;1个工作日内通过&#xff09;。 4、证书通过后&#xff0c;下…

深度学习算法概念介绍

前言 深度学习算法是一类基于人工神经网络的机器学习方法&#xff0c;其核心思想是通过多层次的非线性变换&#xff0c;从数据中学习表示层次特征&#xff0c;从而实现对复杂模式的建模和学习。深度学习算法在图像识别、语音识别、自然语言处理等领域取得了巨大的成功&#xf…

【STM32 HAL库SPI/QSPI协议学习,基于外部Flash读取。】

1、SPI协议 简介 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface)&#xff0c;即串行外围设备接口&#xff0c;是 一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间&#xff0c;要求通讯速率 较高的场合。 SPI 物理层 SPI 通讯…