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

题解:AcWing 852 spfa判断负环

【题目来源】

AcWing:852. spfa判断负环 - AcWing题库

【题目描述】

给定一个\(n\)个点\(m\)条边的有向图,图中可能存在重边和自环,边权可能为负数。请你判断图中是否存在负权回路

【输入】

第一行包含整数 \(n\)\(m\)

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

【输出】

如果图中存在负权回路,则输出Yes,否则输出No。

【输入样例】

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

【输出样例】

Yes

【解题思路】

image

【算法标签】

《AcWing 852 SPFA判断负环》 #负环判定# #spfa#

【代码详解】

#include <bits/stdc++.h>
using namespace std;// 定义常量
const int N = 2010, M = 10010, INF = 1e9; // N为节点数上限,M为边数上限,INF为无穷大// 定义图的邻接表表示
int h[N], e[M], w[M], ne[M], idx; // h数组存储每个节点的第一条边的索引,e数组存储边的终点,w数组存储边的权重,ne数组存储下一条边的索引,idx为边的计数器// 定义SPFA算法所需的数组
int dist[N], cnt[N]; // dist数组存储从起点到每个节点的最短距离,cnt数组存储每个节点入队次数
queue<int> q; // 队列用于BFS
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算法实现
bool spfa() {// 初始化所有节点的距离为无穷大,并将所有节点入队for (int i = 1; i <= n; i++) {q.push(i);st[i] = true;}// 开始BFSwhile (!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];cnt[j] = cnt[nd] + 1; // 更新入队次数// 如果某个节点入队次数超过n次,说明存在负环if (cnt[j] >= n) return true;// 如果该节点不在队列中,则入队if (!st[j]) {q.push(j);st[j] = true;}}}}return false; // 未发现负环
}int main() {cin >> n >> m; // 输入节点数和边数memset(h, -1, sizeof(h)); // 初始化邻接表while (m--) {int a, b, c;cin >> a >> b >> c; // 输入边的起点、终点和权重add(a, b, c); // 添加边}// 初始化距离数组为无穷大memset(dist, INF, sizeof(dist));dist[1] = 0; // 起点到起点的距离为0// 调用SPFA算法if (spfa()) cout << "Yes"; // 存在负环else cout << "No"; // 不存在负环return 0;
}

【运行结果】

3 3
1 2 -1
2 3 4
3 1 -4
Yes
http://www.jsqmd.com/news/399349/

相关文章:

  • 题解:AcWing 851 spfa求最短路
  • 智能指针(三):实现篇 —— 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 / 付费与免费)