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

题解:AcWing 851 spfa求最短路

【题目来源】

AcWing:851. spfa求最短路 - AcWing题库

【题目描述】

给定一个\(n\)个点\(m\)条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出\(1\)号点到\(n\)号点的最短距离,如果无法从\(1\)号点走到\(n\)号点,则输出 impossible。数据保证不存在负权回路。

【输入】

第一行包含整数\(n\)\(m\)。接下来\(m\)行每行包含三个整数 \(x,y,z\),表示存在一条从点\(x\)到点\(y\)的有向边,边长为\(z\)

【输出】

输出一个整数,表示\(1\)号点到\(n\)号点的最短距离。如果路径不存在,则输出 impossible。

【输入样例】

3 3
1 2 5
2 3 -3
1 3 4

【输出样例】

2

【解题思路】

image

【算法标签】

《AcWing 851 SPFA求最短路》 #最短路# #spfa#

【代码详解】

#include <bits/stdc++.h>
using namespace std;// 定义常量
const int N = 100010, M = N, INF = 1e9; // N为节点数上限,M为边数上限,INF为无穷大// 定义邻接表相关数组
int h[N], e[M], w[M], ne[M], idx; // h存储每个节点的第一条边的索引,e存储边的终点,w存储边的权重,ne存储下一条边的索引,idx为边的计数器
int dist[N]; // dist存储从起点到每个节点的最短距离
queue<int> q; // 队列用于广度优先搜索
bool st[N]; // st标记节点是否在队列中// 定义节点数和边数
int n, m;// 添加边的函数
void add(int a, int b, int c) {e[idx] = b, w[idx] = c; // 设置边的终点和权重ne[idx] = h[a], h[a] = idx++; // 更新邻接表
}// SPFA算法实现
int spfa() {fill(dist, dist + N, INF); // 初始化距离为无穷大dist[1] = 0; // 起点距离设为0q.push(1); // 将起点加入队列st[1] = true; // 标记起点在队列中while (!q.empty()) {int nd = q.front(); q.pop(); // 取出队首元素st[nd] = false; // 标记该节点不在队列中for (int i = h[nd]; i != -1; i = ne[i]) { // 遍历所有邻接边int j = e[i]; // 邻接节点if (dist[j] > dist[nd] + w[i]) { // 如果通过当前节点到达邻接节点更近dist[j] = dist[nd] + w[i]; // 更新最短距离if (!st[j]) { // 如果邻接节点不在队列中q.push(j); // 将邻接节点加入队列st[j] = true; // 标记邻接节点在队列中}}}}return dist[n]; // 返回从起点到终点的最短距离
}// 主函数
int main() {cin >> n >> m; // 输入节点数和边数memset(h, -1, sizeof(h)); // 初始化邻接表头指针为-1while (m--) { // 读取所有边的信息int a, b, c;cin >> a >> b >> c;add(a, b, c); // 添加边}int ans = spfa(); // 计算最短路径if (ans == INF) cout << "impossible"; // 如果无法到达终点,输出"impossible"else cout << dist[n]; // 否则输出最短距离return 0;
}

【运行结果】

3 3 
1 2 5
2 3 -3
1 3 4
2
http://www.jsqmd.com/news/399348/

相关文章:

  • 智能指针(三):实现篇 —— shared_ptr 的内部设计与引用计数机制
  • 智能指针(二):机制篇 —— 移动语义与所有权转移
  • 【单片机】vscode环境配置
  • 智能指针(四):体系篇 —— 现代 C++ 内存管理全景图
  • 桌面整理 Desk Tidy
  • 使用 Python + Tkinter 打造“猫狗大战“回合制策略游戏
  • 瑞祥商联卡回收,闲置卡券如何变身“隐形钱包”? - 京顺回收
  • deepspeed训练框架
  • 智能家居AI模型服务化:架构设计最佳实践
  • 《信号与系统》欧拉公式的几何意义与物理学意义:不只是数学,更是宇宙的旋转密码
  • 轴承故障诊断是工业设备监测的重要方向,今天咱们用MATLAB搞个玩具级别的轴承动力学模型。先甩开复杂的数学推导,直接上手写点能跑起来的代码
  • 如何将集体好奇心转化为商业价值
  • [macbookpro] macbook pro m4 关闭开盖就开机的问题
  • 【egui】[特殊字符] 窗口配置小抄:eframe::NativeOptions
  • 从零搭建JumpServer
  • 大数据领域 HBase 的安全机制解析
  • Python全能框架Feapder,四种模式应对复杂场景
  • 大数据领域数据科学的图像识别应用
  • AI原生应用助力决策支持:开启智能决策新时代
  • Flink在实时欺诈检测中的实战应用
  • 修复CVE-2024-20267:Cisco NX-OS中MPLS封装IPv6处理的高危DoS漏洞
  • AI人工智能领域,Stable Diffusion的应用案例
  • Netzwerk von Daten
  • 半结构化数据与数据仓库:集成方案与最佳实践
  • Warum ist Japan seit 1990 gefallen?
  • c# wpf生命周期
  • 基于LSTM神经网络的共享单车需求预测系统设计与实现
  • 环境介绍
  • Feedly 抓 News → 自动入库 Notion”的方案,并附上详细流程图(含分支:有 RSS / 没 RSS / 付费与免费)
  • 基于KPCA的故障诊断与检测探索