最短路径专题5 最短路径

题目:

样例:

输入
4 5 0 2
0 1 2
0 2 5
0 3 1
1 2 2
3 2 2

输出
3 0->3->2

思路:

        根据题目意思,求最短路,这个根据平时的Dijkstra(堆优化)即可,关键在于求路径的方法,求路径的方法有很多种,其中最经典的就是通过 DFS递归求路径,其中我之前做的笔记 BFS求路径 便是用到了该方法。

DFS递归求路径方法核心思想

1、初始化记录数组为某一个特定值,比如初始化为  -1,方便递归求路径边界;

2、记录当前结点是由哪上一个结点走动的;

3、DFS递归求路径函数,由于是当前结点记录上一个结点,所以递归由终点开始,到起点结束。

代码详解如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define x first
#define y second
#define mk make_pair
#define int long long
#define NO puts("NO")
#define YES puts("YES")
#define umap unordered_map
#define INF 0x3f3f3f3f3f3f3f3f
#define All(x) (x).begin(),(x).end()
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
using PII = pair<int,int>;int n,m,start,last;int dist[N];	// 记录最短路距离
int tree[N];	// 记录路径
bool st[N];		// 标记走动结点vector<int>path;	// 存储路径结点// 建立链表
int h[N],e[N],w[N],ne[N],idx;
inline void Add(int a,int b,int c)
{e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx++;
}inline void Dijkstra()
{// 初始化记录路径数组memset(tree,-1,sizeof tree);// 初始化最短距离memset(dist,INF,sizeof dist);dist[start] = 0;// 建立堆priority_queue<PII,vector<PII>,greater<PII>>q;// 存储起点和最短距离的对组q.push(mk(0,start));// 开始堆排序的求值while(q.size()){// 获取当前结点的对组PII now = q.top();q.pop();int a = now.y;	// 获取当前结点int dis = now.x;// 获取当前结点相关的最短距离// 如果当前结点走动过,进入下一个结点的最短距离更新if(st[a]) continue;	st[a] = true;	// 标记当前结点for(int i = h[a];i != -1;i = ne[i]){// 获取相关结点int j = e[i];// 更新最短距离if(dist[j] > dis + w[i]){dist[j] = dis + w[i];tree[j] = a;	// 记录当前结点 j 由 a 走动得来的}// 存储当前结点 j 和相关最短距离 的对组q.push(mk(dist[j],j));}}return ;
}void getPath(int now)
{// 如果当前状态到达了边界起点// 那么开始回溯递归取路径if(now == start){path.emplace_back(now);return ;}// 递归上一个结点getPath(tree[now]);// 回溯回来,取当前结点path.emplace_back(now);
}inline void solve()
{// 初始化链表memset(h,-1,sizeof h);cin >> n >> m >> start >> last;while(m--){int a,b,c;cin >> a >> b >> c;// 由于是无向图,添加相连两个结点的链表Add(a,b,c);Add(b,a,c);}// Dijkstra 求值Dijkstra();// 根据终点递归获取路径getPath(last);// 输出最短距离cout << dist[last] << ' ';// 输出最短路径bool rem = false;	// 控制输出格式for(int i : path){if(rem) cout << "->";cout << i;rem = true;}return ;
}signed main()
{
//	freopen("a.txt", "r", stdin);___G;int _t = 1;
//	cin >> _t;while (_t--){solve();}return 0;
}

最后提交:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】[gdb]Linux环境下如何调试代码

一、code.c文件 我们首先创建一个code.c文件&#xff0c;写一段简单代码&#xff0c;用于测试。 二、makefile文件 然后&#xff0c;我们可以编写makefile文件&#xff0c;使得code.c文件能够进行编译。&#xff08;当然也可以不写makefile文件&#xff0c;直接对code.c进行编…

大选择核网络在遥感目标检测中的应用

摘要 论文链接&#xff1a;https://arxiv.org/pdf/2303.09030.pdf 最近关于遥感目标检测的研究主要集中在改进有向边界框的表示&#xff0c;但忽略了遥感场景中呈现的独特先验知识。这种先验知识很有用&#xff0c;因为如果没有参考足够远的上下文&#xff0c;可能会错误地检测…

设计模式探索:从理论到实践的编码示例 (软件设计师笔记)

&#x1f600;前言 设计模式&#xff0c;作为软件工程领域的核心概念之一&#xff0c;向我们展示了开发过程中面对的典型问题的经典解决方案。这些模式不仅帮助开发者创建更加结构化、模块化和可维护的代码&#xff0c;而且也促进了代码的复用性。通过这篇文章&#xff0c;我们…

windows系统下pycharm配置anaconda

参考&#xff1a;超详细的PycharmAnconda安装配置教程_pycharm conda_罅隙的博客-CSDN博客 下载好anaconda安装后&#xff0c;比如我们安装在D盘anaconda文件夹下&#xff0c;在pycharm配置好环境激活时出现问题&#xff0c;可能是电脑没有配置环境变量 需要将一下4行添加到电…

axb_2019_brop64

axb_2019_brop64 Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)64位&#xff0c;只开了NX __int64 repeater() {size_t v1; // raxchar s[208]; // [rsp0h] [rbp-D0h] BYREFprintf("…

Qt扩展-QCustomPlot 用户交互

QCustomPlot 用户交互 一、概述二、操作范围三、选择机制1. 控制Graph的可选择性和选择状态2. 所选对象的外观3. 多部分对象4. 对选择变化做出反应 四、用户交互信号 一、概述 QCustomPlot提供了多个内置的用户交互。它们大致可以分为 通过用鼠标拖动和滚动鼠标滚轮进行范围操…

MySQL 性能优化

MySQL 性能优化 数据库命名规范 所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用 MySQL 保留关键字&#xff08;如果表名中包含关键字查询时&#xff0c;需要将其用单引号括起来&#xff09;数据库对象的命名要能做到见名识意&#xff0c;并且最…

微信小程序-1

微信开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ 报错在调试器的console里找 一、结构 Ctrl 放大字体 Ctrl - 缩小 设置 - - - 外观设置 - - - 可以修改喜欢的主题颜色 index.js index.json index.wxml 》 html <view class"box&qu…

Ubuntu安装samba服务器

为了window系统下能够像访问本地目录一样访问ubuntu系统下的目录&#xff0c;这里我通过安装samba服务器&#xff0c;将ubuntu系统的文件目录通过网络挂载的方式共享出来&#xff0c;以便在window下就能够对ubuntu系统的文件进行读写等访问操作&#xff0c;这里记录一下samba服…

SpringBoot快速入门

搭建SpringBoot工程&#xff0c;定义hello方法&#xff0c;返回“Hello SpringBoot” ②导入springboot工程需要继承的父工程&#xff1b;以及web开发的起步依赖。 ③编写Controller ④引导类就是SpringBoot项目的一个入口。 写注解写main方法调用run方法 快速构建SpringBoo…

Redis分页+多条件模糊查询组合实现思路

Redis是一个高效的内存数据库&#xff0c;它支持包括String、List、Set、SortedSet和Hash等数据类型的存储&#xff0c;在Redis中通常根据数据的key查询其value值&#xff0c;Redis没有模糊条件查询&#xff0c;在面对一些需要分页、排序以及条件查询的场景时(如评论&#xff0…

MyCat实现分库分表技术

目录 一、分库分表 1.1介绍 1.1.1问题分析 1.1.2拆分策略 1.1.3垂直拆分 1.1.3.1垂直分库 1.1.3.2垂直分表 1.1.4水平拆分 1.1.4.1水平分库 1.1.4.2水平分表 1.1.5实现技术 二、MyCat概述 2.1介绍 2.2下载 2.3安装 2.4目录介绍 2.5概念介绍 三、MyCat入门 3.…

MyBatisPlus(八)范围查询

说明 范围查询&#xff0c;包括&#xff1a; 大于大于等于小于小于等于在范围内在范围外 大于&#xff1a;gt 代码 Testvoid gt() {LambdaQueryWrapper<User> wrapper new LambdaQueryWrapper<>();wrapper.gt(User::getAge, 20);List<User> users mapp…

MyBatis-plus快速代码生成,使用MybatisX插件

概述 MyBatis提供逆向工程&#xff0c;可以快速生成代码。 而MyBatis-plus也提供了一个代码生成器&#xff0c;它需要执行一些代码来实现。 而MybatisX 是一款基于 IDEA 的快速开发插件&#xff0c;为效率而生&#xff0c;你不需要写代码&#xff0c;直接界面化操作&#xf…

python 学习随笔 4

列表list 将序列前几个进行替换&#xff08;数量可以不同&#xff09; 将序列进行间隔替换&#xff08;必须保证数量相同&#xff0c;否则报错&#xff09; 删除序列内元素 向序列后新增一个元素 向序列后新增多个元素 将序列进行数乘&#xff08;不是产生几个序列哦&#xff0…

三、git的安装和配置

一、安装 1.官网下载&#xff1a;https://git-scm.com/download 下载最新版本&#xff0c;点击红框或篮筐处即可 2.点击下载好的安装包安装这个软件 3.一直点击next&#xff0c;直到出现install&#xff0c;点击install&#xff0c;安装完成后点击finish&#xff1a; 下载完成…

【Mysql专题】视图介绍及其基本操作

前言 前段时间&#xff0c;跟客户开个线上会议&#xff0c;在和对方技术人员讨论到如何把数据给我们的时候&#xff0c;对方说【丢给你们一个视图&#xff0c;你们查视图就好了】我一下子懵了。当时现场贼尴尬&#xff0c;我只能假装断线了&#xff0c;然后又模棱两可的说了几…

【网络安全---ICMP报文分析】Wireshark教程----Wireshark 分析ICMP报文数据试验

一&#xff0c;试验环境搭建 1-1 试验环境示例图 1-2 环境准备 两台kali主机&#xff08;虚拟机&#xff09; kali2022 192.168.220.129/24 kali2022 192.168.220.3/27 1-2-1 网关配置&#xff1a; 编辑-------- 虚拟网路编辑器 更改设置进来以后 &#xff0c;先选择N…

10.1 调试事件读取寄存器

当读者需要获取到特定进程内的寄存器信息时&#xff0c;则需要在上述代码中进行完善&#xff0c;首先需要编写CREATE_PROCESS_DEBUG_EVENT事件&#xff0c;程序被首次加载进入内存时会被触发此事件&#xff0c;在该事件内首先我们通过lpStartAddress属性获取到当前程序的入口地…

阿里云免费服务器无法领取限制说明

阿里云提供免费服务器供用户申请&#xff0c;但是领取免费服务器是有条件的&#xff0c;并不是有所的阿里云用户均可领取免费云服务器&#xff0c;免费服务器领取条件为&#xff1a;账号从未使用过阿里云服务器的用户&#xff0c;阿里云百科来举例说明免费服务器领取说明&#…