最短路问题之Dijkstra算法 洛谷 单源最短路径

Dijkstra算法具体解释

Dijkstra算法用于解决单源最短路径问题,即找出从一个源节点到其他所有节点的最短路径。该算法的前提是图中不能有负权边,因为它基于贪心策略。Dijkstra算法的基本思想是通过逐步确定到达每个节点的最短路径长度来求解问题。其主要步骤如下:

  1. 初始化:将源点到各个顶点的距离初始化为无穷大,源点的距离初始化为0。

  2. 选取源点:从未被标记为已确定最短路径的节点中选择一个距离最小的节点作为当前节点。

  3. 更新距离:对于当前节点的每个邻接节点,如果通过当前节点到达该邻接节点的路径比已知路径更短,则更新该邻接节点的最短路径长度。

  4. 标记节点:将当前节点标记为已确定最短路径。

  5. 重复步骤2至4,直到所有节点都被标记为已确定最短路径,或者找到了目标节点的最短路径。

核心:贪心策略

memset(d,0x3f,sizeof d);
d[x]=0;
for(int i=1;i<n;i++){int u=0;for(int j=1;j<=n;j++){if(!st[j]&&d[j]<d[u]) u=j;}
}

核心代码,目的是为了找在经历了i次松弛操作以后里x点最近的点,只要每次都是找最近的点,最后的距离就一定是最短的,当然dj处理不了负权边

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

AC code(普通版n*n)

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int mod=2147483647; 
int n,m,s;
int u,v,w;
vector<PII> vv[100010];
long long d[10010];
int st[10010];void dijkstra(int x){memset(d,0x3f,sizeof d);d[x]=0;for(int i=1;i<n;i++){int u=0;for(int j=1;j<=n;j++){if(!st[j]&&d[j]<d[u]) u=j;}st[u]=1;for(auto ed:vv[u]){int a=ed.first,b=ed.second;if(d[a]>d[u]+b) d[a]=d[u]+b;}}
}int main()
{cin>>n>>m>>s;for(int i=0;i<m;i++){cin>>u>>v>>w;vv[u].push_back({v,w});}dijkstra(s);for(int i=1;i<=n;i++){if(d[i]<=1e9) cout<<d[i]<<" ";else cout<<mod<<" ";}return 0;
} 

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

堆优化版

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int mod=2147483647; 
int n,m,s;
int u,v,w;
vector<PII> vv[200010];
long long d[100010];
int st[100010];
priority_queue<PII> q;void dijkstra(int x){memset(d,0x3f,sizeof d);d[x]=0;q.push({0,x});while(q.size()){auto t=q.top();q.pop();int u=t.second;if(st[u]) continue; st[u]=1;for(auto ed:vv[u]){int a=ed.first,b=ed.second;if(d[a]>d[u]+b){d[a]=d[u]+b;q.push({-d[a],a});}}}
}int main()
{cin>>n>>m>>s;for(int i=0;i<m;i++){cin>>u>>v>>w;vv[u].push_back({v,w});}dijkstra(s);for(int i=1;i<=n;i++){if(d[i]<=1e9) cout<<d[i]<<" ";else cout<<mod<<" ";}return 0;
} 

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

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

相关文章

十、使用repo管理yocto各个layer

文章目录 使用repo管理yocto各个layer一、创建repo环境二、创建rpi robot的manifest三、实践 使用repo管理yocto各个layer 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi…

深度Q-Learning在算法交易中的应用

一、说明 在《华尔街的随机漫步》一书中&#xff0c;作者伯顿马尔基尔&#xff08;Burton G. Malkiel&#xff09;声称&#xff1a;“一只蒙着眼睛的猴子向报纸的财经版面投掷飞镖&#xff0c;可以选择一个与专家精心挑选的投资组合一样好的投资组合。 如果我们让巴甫洛夫的狗接…

[卷积神经网络]YoloV8

一、YoloV8 1.网络详解 ①backbone部分&#xff1a;第一次卷积的卷积核缩小(由3变为6)&#xff1b;CSP模块的预处理卷积从3次变为2次&#xff1b;借鉴了YoloV7的多分支堆叠结构&#xff08;Multi_Concat_Block&#xff09;。 所小第一次卷积的卷积核尺寸会损失部分感受野&#…

2024年 10 款最佳免费数据恢复软件您值得收藏

免费的数据恢复软件或工具是最重要的工具之一&#xff0c;在我们的生活中发挥着非常重要和关键的作用&#xff0c;尽管现在您可以找到数十种&#xff0c;但事实是它们非常重要。 由于设备故障、勒索软件攻击或意外擦除数据而从设备中丢失数据可能会成为一个真正的头痛问题。 …

专题【二分查找】刷题日记

题目列表 4. 寻找两个正序数组的中位数 33. 搜索旋转排序数组 34. 在排序数组中查找元素的第一个和最后一个位置 35. 搜索插入位置 69. x 的平方根 167. 两数之和 II - 输入有序数组 209. 长度最小的子数组 222. 完全二叉树的节点个数 287. 寻找重复数 2023.04.14 4. 寻找两…

自然语言处理基础面试

文章目录 TF-IDFbag-of-wordsBert 讲道理肯定还得有Transformer&#xff0c;我这边先放着&#xff0c;以后再加吧。 TF-IDF TF&#xff08;全称TermFrequency&#xff09;&#xff0c;中文含义词频&#xff0c;简单理解就是关键词出现在网页当中的频次。 IDF&#xff08;全称…

spring boot: 使用MyBatis从hive中读取数据

一、hive表&#xff1a; 启动hiveserver2 二、添加mybatis starter和hive依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

力扣HOT100 - 24. 两两交换链表中的节点

解题思路&#xff1a; 递归 class Solution {public ListNode swapPairs(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead head.next;head.next swapPairs(newHead.next);newHead.next head;return newHead;} }

什么是缓存?在NGINX中如何配置缓存以提升性能?

缓存是一种在计算机系统中常用的技术&#xff0c;用于存储临时数据副本&#xff0c;以便在将来的请求中更快地访问这些数据。缓存可以显著提升应用程序和网站的性能&#xff0c;因为它可以减少对后端服务器或数据库的重复请求&#xff0c;从而减少响应时间并降低资源消耗。 在W…

案例实践 | InterMat:基于长安链的材料数据发现与共享系统

案例名称&#xff1a;InterMat-基于区块链的材料数据发现与共享系统 ■ 建设单位 北京钢研新材科技有限公司 ■ 用户群体 材料数据上下游单位 ■ 应用成效 已建设10共识节点、50轻节点&#xff0c;1万注册用户 案例背景 材料是构成各种装备和工程的物质载体&#xff0c…

驱动开发-windows驱动设计目标

驱动程序和应用程序不一样的&#xff0c;由于其直接运行于windows r0级&#xff0c;故对于开发有更多和更严格的标准&#xff0c;一般会有以下一些常见的设计目标: 安全性、可移植性、可配置性、 可被中断、多处理器安全、可重用 IRP、 支持异步 I/O这些是基本目标。 1. 安全…

高频前端面试题汇总之Vue篇

1. Vue的基本原理 当一个Vue实例创建时&#xff0c;Vue会遍历data中的属性&#xff0c;用 Object.defineProperty&#xff08;vue3.0使用proxy &#xff09;将它们转为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访问和修改时通知变化。 每个组件实…

Flutter 之 HTTP3/QUIC 和 Cronet 你了解过吗?

虽然 HTTP3/QUIC 和 cronet 跟 Flutter 没太大关系&#xff0c;只是最近在整理 Flutter 相关资料时发现还挺多人不了解&#xff0c;就放到一起聊聊。 本篇也是主要将现有资料做一些简化整合理解。 前言 其实为什么会有 HTTP3/QUIC &#xff1f;核心原因还是现有协议已经无法满…

前端工程搭建:

搭建前端工程最主要的是技术选型&#xff0c;如果技术选型不够全面或不合适&#xff0c;会出现很多问题。技术选型通常会涉及基础框架、打包构建工具、网络库、组件库、CSS预编译语言、状态管理、IDE、代码质量检查工具、包管理工具、版本控制工具等 CSS预编译语言 搭建工程没有…

机器学习周记(第三十五周:语义分割)2024.4.15~2024.4.21

目录 摘要 ABSTRACT 1 语义分割基本概念 1.1 数据集格式 ​编辑 1.2 语义分割评价指标 1.3 语义分割标注工具 2 转置卷积 3 FCN网络结构基本原理 摘要 本周主要学习了语义分割的基本概念及其在计算机视觉领域中的应用。了解了语义分割的几种经典网络&#xff0c;如全卷…

linux系统密码重置的方法

在linux系统中忘记密码&#xff0c;重置&#xff08;重启&#xff1a;shutdown -r now&#xff09; 1、在启动 Linux 时&#xff0c;按键盘上的上下左右键来止 Linux 的正常启动。 2、按下e鍵进入安全模式 3、找到首行是linux16&#xff0c;末尾是UTF-8的段落&#xff0c;在后门…

Python中的设计模式与最佳实践

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的设计模式与最佳实践 在软件开发中&#xff0c;设计模式是一种解决常见问题的经过…

APP开发_ js 控制手机横屏或竖屏

1 Android 控制手机横屏或者竖屏的方法 1.1 配置 AndroidManifest.xml 以横屏模式为例&#xff1a; 在 Android 开发中&#xff0c;如果想让应用或某个特定的 Activity 在运行时以横屏模式显示&#xff0c;可以通过修改 Activity 的 AndroidManifest.xml 文件中的配置来实现…

【Django】调用django的pbkdf2_sha256加密算法测试

基于django搭建的系统中&#xff0c;用到pbkdf2_sha256&#xff08;&#xff08;Password-Based Key Derivation Function 2&#xff09;&#xff09;加密算法&#xff0c;这里做些代码测试、总结。 PBKDF2简介 PBKDF2是一种基于密码的密钥派生函数&#xff0c;用于从用户提供的…

C语言读写文件和C++读写文件

文本文件读写&#xff1a; "r"&#xff1a;只读模式打开文本文件&#xff0c;文件必须存在。"w"&#xff1a;写入模式打开文本文件&#xff0c;如果文件不存在则创建新文件。"a"&#xff1a;追加模式打开文本文件&#xff0c;如果文件不存在则创…