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

SPFA算法:负权图最短路径与负环检测

一、上期回顾掌握堆优化 Dijkstra 算法解决非负权单源最短路径。但 Dijkstra 遇到负权边会失效今天学习SPFA队列优化 Bellman-Ford专门处理带负权图还能判断负环。二、SPFA 基础介绍1. 适用场景求带负权边图的单源最短路径检测图中是否存在负环负权回路有负环时最短路径无意义可以无限绕环减小距离2. 核心思想基于 Bellman-Ford 原理用队列优化不断将被松弛成功的节点入队重复更新邻居节点距离每个节点重复入队次数超标 → 判定存在负环3. 限制不能处理负权回路上的最短路径只能检测负环。三、前置准备沿用邻接表存图定义数组含义const int N 10005; vectorpairint, int edge[N]; // edge[u] {v, 边权w} int dist[N]; // 起点到各点最短距离 int cnt[N]; // 记录每个节点入队次数用于判负环 bool inQueue[N];// 标记节点是否在队列中避免重复入队四、SPFA 标准模板求最短路 判负环#include iostream #include vector #include queue #include climits using namespace std; const int N 10005; const int INF INT_MAX; vectorpairint, int edge[N]; int dist[N]; int cnt[N]; bool inQueue[N]; int n, m; // 返回值true 存在负环false 无负环 bool spfa(int start) { // 初始化 fill(dist, dist N, INF); fill(cnt, cnt N, 0); fill(inQueue, inQueue N, false); queueint q; dist[start] 0; q.push(start); inQueue[start] true; cnt[start] 1; while (!q.empty()) { int u q.front(); q.pop(); inQueue[u] false; // 遍历所有邻边 for (auto e : edge[u]) { int v e.first; int w e.second; // 松弛操作找到更短路径 if (dist[u] ! INF dist[v] dist[u] w) { dist[v] dist[u] w; if (!inQueue[v]) { q.push(v); inQueue[v] true; cnt[v]; // 关键点入队次数 节点数存在负环 if (cnt[v] n) return true; } } } } return false; } int main() { cin n m; for (int i 0; i m; i) { int u, v, w; cin u v w; edge[u].emplace_back(v, w); // 无向图额外加edge[v].emplace_back(u, w); } bool hasLoop spfa(1); if (hasLoop) { cout 图中存在负环 endl; } else { cout 最短路径 endl; for (int i 1; i n; i) { if (dist[i] INF) cout 不可达 ; else cout dist[i] ; } } return 0; }五、核心逻辑拆解1. 松弛操作if (dist[v] dist[u] w) dist[v] dist[u] w;从 u 走到 v 能得到更短距离就更新。2. 队列去重inQueue[]标记节点是否在队列同一节点不重复入队提升效率。3. 负环判定原理一个正常图每个节点最多被松弛n-1次n 为总顶点数。如果某个节点入队次数 ≥ n说明陷入负环可以无限更新距离。六、SPFA 与 Dijkstra 对比表格算法适用条件数据结构特点Dijkstra边权非负优先队列 (堆)效率高O (E logV)SPFA允许负权边不能有负环求最短路普通队列可判负环不稳定七、常见易错点距离数组初始化为无穷大起点距离置 0一定要判断dist[u] ! INF避免不可达节点更新负环判定条件cnt[v] n无向图需要双向建边八、今日核心总结SPFA 是队列优化版 Bellman-Ford支持负权边核心流程松弛 → 入队 → 循环遍历利用入队次数检测负环是考试高频考点负环存在时不存在合法最短路径负权图选 SPFA非负权图优先 Dijkstra九、课后练习搭建带负权边的图运行 SPFA 输出最短路手动构造负环验证负环检测功能对比 Dijkstra 和 SPFA 的使用场景差异
http://www.rkmt.cn/news/1403845.html

相关文章:

  • EmulatorJS版本选择终极指南:如何挑选最适合你的复古游戏模拟器版本
  • flex布局
  • 成都制造企业插单太频繁,AI该先算哪些优先级?
  • 魔兽争霸3终极优化指南:5分钟告别画面拉伸和帧率限制
  • 从gitbus项目看Git仓库作为隐式控制平面的安全风险与防御
  • 大规模MIMO系统能效优化:低精度ADC与检测算法的协同设计
  • PyQt-Fluent-Widgets:让Python桌面应用拥有Windows 11现代化界面的终极指南
  • 模拟神经网络芯片:纳瓦级功耗实现生物医学边缘AI分类
  • Python学习第47天:ORM与数据库操作
  • 如何在3天内搭建你的专属缠论量化分析系统:从零到实战的完整指南
  • FanControl终极指南:3步实现Windows电脑风扇静音控制
  • 免费、隐私、环保!Ollama本地AI优势多,你还不用?
  • BLE 5.1室内定位实战:基于真实PPE追踪数据集的算法开发与性能分析
  • HoRain云--Claude Code 控制 Chrome 浏览器
  • 3分钟部署指南:跨浏览器批量URL管理的高效解决方案
  • 华硕笔记本终极性能管家:GHelper轻量控制工具完整使用指南
  • 【2026-05-25】丐版家旅
  • 3分钟搞定音乐加密文件:Unlock Music 完全指南
  • 钉钉消息防撤回补丁:职场沟通的终极信息保护方案
  • 锋芒剪辑-dota2自动剪辑微信小程序
  • 5分钟快速上手B站视频下载神器:BiliDownloader完整使用指南
  • 佛山1688代运营做家装建材类目哪家性价比高
  • 重庆黄金回收为什么别选小店?对比宝奢、典表,合扬优势更明显 - 合扬奢侈品交易中心
  • 逆衬垫Z箍缩:实验室可控辐射冲击波平台的设计与物理验证
  • 基于LPC-FCN的轻量级触觉纹理识别:边缘计算中的高效解决方案
  • 玉溪市红塔区黄金回收实战指南:991元/克大盘价下,这六家机构值得收藏 - 润富黄金珠宝行
  • 免费电子课本获取终极指南:3分钟搞定国家智慧教育平台教材下载
  • 如何用RuoYi-Ant在5分钟内构建企业级后台管理系统
  • 情境感知与自适应学习:UTROLL/KANTEAM移动语言学习系统架构解析
  • MATLAB实战:从频谱到1/3倍频程的声学信号全流程解析