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

news/2024/6/1 20:52:01/文章来源:https://blog.csdn.net/weixin_73793099/article/details/136137939

目录

算法思路

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;
}

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

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

相关文章

tldraw —— 免费开源的白板绘图工具

项目名: tldraw -- 无限画布白板 Github 开源地址&#xff1a; GitHub - tldraw/tldraw: Infinite canvas. 在线测试地址&#xff1a; tldraw 文档地址&#xff1a; tldraw docs tldraw 是一款开源免费的无限画布白板&#xff0c;可以在线的实时协作&#xff0c;用户能够创…

Code Composer Studio (CCS) - Licensing Information

Code Composer Studio [CCS] - Licensing Information 1. Help -> Code Composer Studio Licensing Information2. Upgrade3. Specify a license fileReferences 1. Help -> Code Composer Studio Licensing Information 2. Upgrade ​​​ 3. Specify a license file …

【Kubernetes in Action笔记】1.快速开始

在Kubernetes上运行一个程序 基础运行环境 当前的运行环境为使用虚拟机构建的单master集群。 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 109d v1.27.1 k8s-node1 Ready …

【.NET Core】深入理解async 和 await 理解

【.NET Core】深入理解async 和 await 理解 文章目录 【.NET Core】深入理解async 和 await 理解一、概述二、async异步执行机制理解三、async与await应用3.1 async与await简单应用3.2 带有返回值async与await应用 四、async和await中常见问题总结4.1 当方法用async标识时&…

普中51单片机学习(六)

点亮第一个LED LED相关知识 LED,即发光二极管&#xff0c;是一种半导体固体发光器件。工作原理为&#xff1a;LED的工作是有方向性的&#xff0c;只有当正级接到LED阳极&#xff0c;负极接到LED的阴极的时候才能工作&#xff0c;如果反接LED是不能正常工作的。其原理图如下 …

Open CASCADE学习|曲线向曲面投影

在三维空间中&#xff0c;将曲线向曲面投影通常涉及复杂的几何计算。这个过程可以通过多种方法实现&#xff0c;但最常见的是使用数学和几何库&#xff0c;如OpenCASCADE&#xff0c;来处理这些计算。 在OpenCASCADE中&#xff0c;投影曲线到曲面通常涉及以下步骤&#xff1a;…

激活函数30年回顾总结,全paper第一份详尽研究来了!

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 新年好&#xff0c;离退休又近了一年 假期躺平未更新&#xff0c;但该保存的素材及热点还是拿小本本记了下来&#xff0c;如这篇今年2月14号arXiv上发表的长达100页神经网络中激活函数大总结文章就进…

[力扣 Hot100]Day28 两数相加

题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

ClickHouse监控及备份

第1章 ClickHouse监控概述 第2章 Prometheus&Grafana的安装 第3章 ClickHouse配置 第4章 Grafana集成Prometheus 第5章 备份及恢复

php数据类型以及运算符、判断条件

php数据类型以及运算符 1. php数据类型2. 使用举例3. 运算符4. 判断条件if else elseif 1. php数据类型 包括 String(字符串)、Integer(整型)、Float(浮点型)、Boolean(布尔型)、Array(数组)、Object(对象)、NULL(空值) 2. 使用举例 1.字符串 2.整型 3.浮点型 4.布尔型 5.数组…

模拟发送 Ctrl+Alt+Del 快捷键

目录 前言 一、在 XP 系统上模拟 SAS 二、在不低于 Vista 的系统上模拟 SAS 2.1 一些细节 2.2 实现原理和应用 三、完整实现代码和测试 3.1 客户端控制台程序 3.2 服务程序 3.3 编译&测试程序 四、总结&更新 参考文献 前言 对于开启了安全登陆的窗口工作站…

二叉树相关OJ题

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 一、选择题 1、某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&#xff08; &#xff09; A.不存在这样的二叉树 B.200 C.198 D.199解析&#xff1a;选B&…

探索API测试的奇妙世界:总结与思考!

本文主要是关于 API 测试的方法论探讨。 什么是 API 测试&#xff1f; API 测试是一种软件测试&#xff0c;涉及验证和确认应用程序接口 ( API ) 及其与其他服务组件的交互。测试重点关注软件架构的业务逻辑层&#xff0c;确保API按预期运行、数据准确交换、服务在各种条件下…

【数据结构】17 二叉树的建立

二叉树的建立 由于树是非线性结构&#xff0c;创建一颗二叉树必须首先确定树中结点的输入顺序&#xff0c;常用方法是先序创建和层序创建。 层序创建所用的节点输入序列是按数的从上至下从左到右的顺序形成的各层的空结点输入数值0。在构造二叉树过程中需要一个队列暂时存储各…

AtCoder Regular Contest 172(仅A题)

A - Chocolate 给N个人分巧克力&#xff0c;分的大小是2^Ai * 2^Ai&#xff0c;给你一个大小为H*W的巧克力&#xff0c;问能不能给N个人都分到要求的巧克力。 假设蓝色是h*w的大巧克力&#xff0c;红色的是要分出来的巧克力&#xff08;四个角落都一样&#xff0c;这里用左上…

又出了一本书!

大家好&#xff0c;我是记得诚。 今天是初九&#xff0c;祝大家开工大吉。 记得诚博客的付费专栏【搞定ESD】已经完结了。 专栏更新的文章如下&#xff1a; 搞定ESD&#xff08;一&#xff09;&#xff1a;静电放电测试标准解析搞定ESD&#xff08;二&#xff09;&#xff…

Json格式文件

1.把Java对象转换成Json格式 1.1.导入依赖 这里推荐一个插件Jackson&#xff0c;其提供的类可以让Java的类转换成Jason格式文件 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><vers…

【C++笔记】第一阶段:C++基础入门

C基础入门 1 C初识1.1 创建一个C程序1.1.1 创建项目1.1.2 创建文件1.1.3 编写代码1.1.4 运行程序 1.2 注释1.3 变量1.4 常量1.5 关键字1.6 标识符命名规则 2 数据类型2.1 整型2.2 sizeof关键字2.3 实型&#xff08;浮点型&#xff09;2.4 字符型2.5 转义字符2.6 字符串型2.7 布…