当前位置: 首页 > news >正文

2024/2/17 图论 最短路入门 dijkstra 1

目录

算法思路

Dijkstra求最短路

AcWing 849. Dijkstra求最短路 I - AcWing

850. Dijkstra求最短路 II - AcWing题库

最短路

最短路 - HDU 2544 - Virtual Judge (vjudge.net)

【模板】单源最短路径(弱化版)

P3371 【模板】单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

【模板】单源最短路径(标准版)

P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

畅通工程续

 畅通工程续 - HDU 1874 - Virtual Judge (vjudge.net)

算法思路

dijkstra解决的是单源的最短路问题,就是一个顶点到其他顶点的最短路问题

开一个数组dist,dist[x]表示从起点出发,到x的距离

比如这幅图,初始情况下,把所有的dist都设置为inf(也就是无穷大)

dist[1]=0,dist[2]=dist[3]=inf

因为1是起点,自己到自己的距离是0

还有一个bool类型的vis数组,因为每个点只能走一次

选当前离起点最近(权值最小)且没有选过的点,来更新其它点的距离

所以如图:

第一次选1号,更新最近的2,3号点 dist[2]=2,dist[3]=4

第二次选2号(因为权值比1到3的小)  dist[2]+1<dist[3],所以dist[3]=dist[2]+1

这个样例的最短路就得到了

Dijkstra求最短路

AcWing 849. Dijkstra求最短路 I - AcWing

850. Dijkstra求最短路 II - AcWing题库

这两道题只有数据范围的差别,用下面的代码可以一次过

注意:

优先队列q里面的pair存的是dist和点数

二维数组g里面的pair存的是点数和边权

完整代码:

#include <bits/stdc++.h>
#define int long long
const int N = 15e4+10;
std::vector<std::vector<std::pair<int,int>>> g(N);
#define PII std::pair<int,int>
signed main()
{int n,m;std::cin >> n >> m;for(int i = 1;i <= m;i ++){int u,v,w;std::cin >> u >> v >> w;g[u].push_back({v,w});}std::priority_queue<PII,std::vector<PII>,std::greater<>> q;std::vector<int> dist(n+1,INT_MAX);std::vector<bool> vis(n+1);dist[1]=0;q.push({0,1});//存dist和点数while(!q.empty()){auto node = q.top();q.pop();int cur=node.second;if(vis[cur]==true)continue;else{vis[cur]=true;for(int i = 0;i < g[cur].size();i ++){int e=g[cur][i].first;int w=g[cur][i].second;if(dist[e]>dist[cur]+w){dist[e]=dist[cur]+w;q.push({dist[e],e});}}}}if(dist[n]==INT_MAX)std::cout<<-1;elsestd::cout<<dist[n];return 0;
}

最短路

最短路 - HDU 2544 - Virtual Judge (vjudge.net)

思路:dijkstra,但是需要建立双向边

注意:多组输入最好不要开全局变量,如果开全局变量记得清空

完整代码:

#include <bits/stdc++.h>
#define int long long
#define PII std::pair<int,int>
const int N = 1e4+10;
signed main()
{int n,m;while(std::cin >> n >> m){if(n==0&&m==0)break;std::vector<std::vector<std::pair<int,int>>>g (N+1);std::priority_queue<PII,std::vector<PII>,std::greater<>> q;std::vector<int> dist(n+1,INT_MAX);std::vector<bool> vis(n+1);dist[1]=0;for(int i = 1;i <= m;i ++){int u,v,w;std::cin >> u >> v >> w;g[u].push_back({v,w});g[v].push_back({u,w});}q.push({0,1});//存dist和点数while(!q.empty()) {auto node = q.top();q.pop();int cur = node.second;if (vis[cur] == true)continue;else {vis[cur] = true;for (int i = 0; i < g[cur].size(); i++) {int e = g[cur][i].first;//存点int w = g[cur][i].second;//存边权if (dist[e] > dist[cur] + w) {dist[e] = dist[cur] + w;q.push({dist[e], e});}}}}std::cout<<dist[n]<<"\n";}return 0;
}

【模板】单源最短路径(弱化版)

P3371 【模板】单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:dijkstra模板

完整代码:

#include <bits/stdc++.h>
#define int long long
#define PII std::pair<int,int>
const int N = 5e5+10;
signed main()
{int n,m,s;std::cin >> n >> m >> s;std::vector<std::vector<std::pair<int,int>>> g(n+1);std::vector<int> dist(n+1,INT_MAX);std::vector<bool> vis(n+1);dist[s]=0;for(int i = 1; i <= m;i ++){int u,v,w;std::cin >> u >> v >> w;g[u].push_back({v,w});}std::priority_queue<PII,std::vector<PII>,std::greater<>> q;q.push({0,s});//存dist和点数while(!q.empty()) {auto node = q.top();q.pop();int cur = node.second;if (vis[cur] == true)continue;else {vis[cur] = true;for (int i = 0; i < g[cur].size(); i++) {int e = g[cur][i].first;//存点int w = g[cur][i].second;//存边权if (dist[e] > dist[cur] + w) {dist[e] = dist[cur] + w;q.push({dist[e], e});}}}}for(int i = 1;i <= n;i ++){std::cout<<dist[i]<<" ";}return 0;
}

【模板】单源最短路径(标准版)

P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

和上一题的代码一样,只是数据范围大一点

完整代码:

#include <bits/stdc++.h>
#define int long long
#define PII std::pair<int,int>
const int N = 5e5+10;
signed main()
{int n,m,s;std::cin >> n >> m >> s;std::vector<std::vector<std::pair<int,int>>> g(n+1);std::vector<int> dist(n+1,INT_MAX);std::vector<bool> vis(n+1);dist[s]=0;for(int i = 1; i <= m;i ++){int u,v,w;std::cin >> u >> v >> w;g[u].push_back({v,w});}std::priority_queue<PII,std::vector<PII>,std::greater<>> q;q.push({0,s});//存dist和点数while(!q.empty()) {auto node = q.top();q.pop();int cur = node.second;if (vis[cur] == true)continue;else {vis[cur] = true;for (int i = 0; i < g[cur].size(); i++) {int e = g[cur][i].first;//存点int w = g[cur][i].second;//存边权if (dist[e] > dist[cur] + w) {dist[e] = dist[cur] + w;q.push({dist[e], e});}}}}for(int i = 1;i <= n;i ++){std::cout<<dist[i]<<" ";}return 0;
}

畅通工程续

 畅通工程续 - HDU 1874 - Virtual Judge (vjudge.net)

思路:用dijkstra,双向建边

完整代码:

#include <bits/stdc++.h>
#define int long long
#define PII std::pair<int,int>
signed main()
{int n,m;while(std::cin >> n >> m){std::vector<std::vector<PII>>g(n+1);std::vector<int> dist(n+1,INT_MAX);std::vector<bool> vis(n+1);std::priority_queue<PII,std::vector<PII>,std::greater<>> q;for(int i = 1;i <= m;i ++){int u,v,w;std::cin >> u >> v >> w;g[u].push_back({v,w});g[v].push_back({u,w});}int s,t;std::cin >> s >> t;dist[s]=0;q.push({0,s});//存dist和点数while(!q.empty()){auto node = q.top();q.pop();int cur=node.second;if(vis[cur]==true)continue;vis[cur]=true;for(int i = 0;i < g[cur].size();i ++){int e=g[cur][i].first;int w=g[cur][i].second;if(dist[e]>dist[cur]+w){dist[e]=dist[cur]+w;q.push({dist[e],e});}}}if(dist[t]==INT_MAX)std::cout<<-1<<"\n";elsestd::cout<<dist[t]<<"\n";}return 0;
}

相关文章:

2024/2/17 图论 最短路入门 dijkstra 1

目录 算法思路 Dijkstra求最短路 AcWing 849. Dijkstra求最短路 I - AcWing 850. Dijkstra求最短路 II - AcWing题库 最短路 最短路 - HDU 2544 - Virtual Judge (vjudge.net) 【模板】单源最短路径&#xff08;弱化版&#xff09; P3371 【模板】单源最短路径&#xf…...

交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)

交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计…...

最适合初学者的Python入门详细攻略,一文讲清,赶紧收藏!

前言 目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广泛&#xff0c;工资也挺高&#xff0c;未来发展也极好。 Python究竟应该怎么学呢&#xff0c;我自己最初也是从零基础开始学习Python的&#xff0c;给大家分享Python的学习思路和方法。一味的买…...

幻兽帕鲁新手游戏攻略分享

在幻兽帕鲁中&#xff0c;提高实力是玩家不断追求的目标。以下是一些提高实力的攻略&#xff1a; 1、升级和进化&#xff1a;通过战斗和完成任务&#xff0c;玩家可以获得经验值&#xff0c;提升自己的等级。随着等级的提升&#xff0c;玩家可以获得技能点&#xff0c;用于提升…...

代码随想录算法训练营DAY19 | 二叉树 (6)

一、LeetCode 654 最大二叉树 题目链接&#xff1a;654.最大二叉树https://leetcode.cn/problems/maximum-binary-tree/ 思路&#xff1a;坚持左开右闭原则&#xff0c;递归划分数组元素生成左右子树。 class Solution {public TreeNode constructMaximumBinaryTree(int[] num…...

【C++】实现Date类的各种运算符重载

上一篇文章只实现了operator操作符重载&#xff0c;由于运算符较多&#xff0c;该篇文章单独实现剩余所有的运算符重载。继续以Date类为例&#xff0c;实现运算符重载&#xff1a; 1.Date.h #pragma once#include <iostream> #include <assert.h>using namespace …...

【Linux】程序地址空间 -- 详解 Linux 2.6 内核进程调度队列 -- 了解

一、程序地址空间回顾 在学习 C/C 时&#xff0c;我们知道内存会被分为几个区域&#xff1a;栈区、堆区、全局/静态区、代码区、字符常量区等。但这仅仅是在语言层面上的理解&#xff0c;是远远不够的。 如下空间布局图&#xff0c;请问这是物理内存吗&#xff1f; 不是&…...

10-通用类型、特质和生命周期

上一篇&#xff1a; 09-错误处理 每种编程语言都有有效处理概念重复的工具。在 Rust 中&#xff0c;泛型就是这样一种工具&#xff1a;具体类型或其他属性的抽象替身。我们可以表达泛型的行为或它们与其他泛型的关系&#xff0c;而不需要知道在编译和运行代码时它们的位置。 函…...

STM32CubeMX,定时器之定时功能,入门学习,如何设置prescaler,以及timer计算PWM输入捕获方法(重要)

频率变小&#xff0c;周期变长 1&#xff0c;参考链接&#xff08;重要&#xff09; STM32CubeMX——定时器之定时功能&#xff08;学习使用timer定时器的设置&#xff09; STM32测量PWM信息&#xff08;学习使用设置pwm输入捕获&#xff09; 通用定时器中两个重要参数的设置心…...

蓝桥杯:C++队列、优先队列、链表

C普通队列 算法竞赛中一般用静态数组来模拟队列&#xff0c;或者使用STL queue。使用C的STL queue时&#xff0c;由于不用自己管理队列&#xff0c;因此代码很简洁。队列的部分操作如下。 C优先队列 很多算法需要用到一种特殊的队列&#xff1a;优先队列。它的特点是最优数据…...

【C语言】长篇详解,字符系列篇1-----“混杂”的各种字符类型字符转换和strlen的模拟实现【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】长篇详解&#xff0c;字符系列篇1-----“混杂”的各种字符函数……&#xff0c;图文讲解各种字符函数&#xff0c;带大家更深刻理解C语言中各种字符函数的应用&#xff0c;感谢观看&#xff0c;支持的可以给个赞哇。 前言…...

2024年【高处安装、维护、拆除】考试总结及高处安装、维护、拆除考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高处安装、维护、拆除考试总结根据新高处安装、维护、拆除考试大纲要求&#xff0c;安全生产模拟考试一点通将高处安装、维护、拆除模拟考试试题进行汇编&#xff0c;组成一套高处安装、维护、拆除全真模拟考试试题&a…...

开源无处不在,发展创新下又有何弊端

随着信息技术的快速发展&#xff0c;开源软件已经成为软件开发的趋势&#xff0c;并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点&#xff0c;使得越来越多的企业和个人选择使用开源软件&#xff0c;促进了软件行业的繁荣。然而&#xff0c;在使用开源软件的过…...

LeetCode 0429.N 叉树的层序遍历:广度优先搜索(BFS)

【LetMeFly】429.N 叉树的层序遍历&#xff1a;广度优先搜索(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/n-ary-tree-level-order-traversal/ 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;…...

Practical User Research for Enterprise UX

2.1 Why It’s Hard to Get Support for Research in Enterprises 2.1.1 Time and Budget Instead of answering the question “What dowe gain if we do this research?”, ask instead “What do we stand to lose if we don’t do the research?” 2.1.2 Legacy Thinkin…...

文生视频:Sora模型报告总结

作为世界模拟器的视频生成模型 我们探索视频数据生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和宽高比的视频和图像上联合训练文本条件扩散模型。我们利用对视频和图像潜在代码的时空补丁进行操作的变压器架构。我们最大的模型 Sora 能够生成一分钟…...

GA 374-2019 电子防盗锁检测

电子防盗锁是指以电子方式识别&#xff0c;处理相关信息并控制执行机构实施启闭且达到规定安全级别的锁具。 GA 374-2019 电子防盗锁检测项目 测试项目 测试标准 外观 GA 374 外壳防护等级 GA 374 功能 GA 374 编码组合数 GA 374 主锁舌伸出长度 GA 374 主锁舌灵活…...

代码随想录day26 Java版

今天开始刷贪心算法&#xff0c;新手保护期中爽得一批 455.分发饼干 先把两个数组排序&#xff0c;采用先满足胃口小的孩子&#xff0c;饼干数组无条件向后扫描&#xff0c;能满足孩子后再向后扫描胃口数组 class Solution {public int findContentChildren(int[] g, int[] …...

英文论文(sci)解读复现【NO.21】一种基于空间坐标的轻量级目标检测器无人机航空图像的自注意

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…...

数据集合

目录 并集 union union all 区别 交集 intersect 差集 minus 错误操作 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 常用的数学集合有&#xff1a;交集、并集、差集、补集 每一次查询实际上都会返回数据集合&#xff0c;…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...