讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么实现迪杰斯特拉算法_C++最短路径求解【路径】

胖瑶吖_4470

胖瑶吖_4470

发布时间:2026-03-02 11:39:11

|

615人浏览过

|

来源于php中文网

原创

Dijkstra需最小堆,std::priority_queue默认最大堆,须用std::greater或自定义比较器;路径还原需prev[]数组,负权边不适用,多终点无需重复运行,字典序路径需松弛时额外比较。

c++怎么实现迪杰斯特拉算法_c++最短路径求解【路径】

用 std::priority_queue 实现 Dijkstra 时,为什么总是得不到正确路径?

因为默认的 std::priority_queue 是最大堆,而 Dijkstra 需要每次取当前距离最小的节点;不重载比较逻辑或换容器,top() 返回的就是错的节点。

  • 必须用 std::greater<:pair int>></:pair> 或自定义比较器,让优先队列按距离升序排列
  • 推荐写法:std::priority_queue<:pair int>, std::vector<:pair int>>, std::greater<:pair int>>></:pair></:pair></:pair>
  • 别把 distance 和 node_id 顺序写反——pair<dist node></dist> 才能靠 first 正确比较
  • 如果图稀疏但用了邻接矩阵,会超时;稠密图才适合矩阵,否则务必用邻接表(vector<vector int>>></vector>)

如何还原最短路径,而不是只算出最短距离?

单纯更新 dist[] 数组只能知道长度,要路径就得记录前驱。Dijkstra 本身不天然支持路径回溯,得手动维护 prev[] 数组。

  • 初始化 prev[i] = -1,松弛成功时立即更新:prev[v] = u(u → v 是更优边)
  • 路径还原用栈或递归逆序输出,避免 vector insert(0, ...) 导致 O(n²) 复杂度
  • 注意:prev 只在松弛成功时更新,不是每次访问都改;重复入队的节点不会覆盖已确定的前驱
  • 如果起点到某点不可达,prev[end] 仍是 -1,别直接解引用

遇到负权边就崩,是算法写错了还是理解错了?

Dijkstra 从数学上就不支持负权边——一旦某个节点被标记为“已确定最短距离”,后续就不再检查,而负权边可能提供更短路径,导致结果错误。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 运行时不会报错,但输出距离明显偏大,或 prev 指向形成环(比如 A→B→A)
  • 确认图中是否存在负权边:读入边权重后加个断言 assert(w >= 0),调试阶段很有用
  • 真有负权且无负环,该换 Bellman-Ford 或 SPFA;有负环则最短路径无定义
  • 别试图“修复”Dijkstra 来处理负权——它不是 bug,是能力边界

多终点 / 路径唯一性 / 重建路径时内存爆炸怎么办?

原始 Dijkstra 是单源单终点思维,但实际常需查多个终点距离、或要求字典序最小路径、或图极大时存不下完整 prev 数组。

立即学习“C++免费学习笔记(深入)”;

  • 多终点:跑一遍 Dijkstra 就够了,所有 dist[end_i] 都有效,不用反复调用
  • 字典序最小路径:松弛时加一层判断——距离相等时,比较 prev[u] 对应的路径字典序,但这要存整个路径串,代价高;更实用的是在松弛条件里加 || (dist[v] == dist[u] + w && prev[v] > u)
  • 内存受限:不用全局 prev[],改用“按需重建”——每个查询终点时,从该点倒推,用哈希表或临时数组存已访问过的前驱,避免存全部
  • 注意:prev 数组大小必须 ≥ 节点数,下标从 0 开始就别用 1-based 初始化漏掉 index 0
事情说清了就结束

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5867

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2508

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5867

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2508

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

5976

2023.08.14

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

0

2026.10.21

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

0

2026.10.21

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

100

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn