0

0

C++如何实现Dijkstra最短路径算法_C++图论算法经典代码实现【算法】

冰火之心

冰火之心

发布时间:2026-02-06 14:57:02

|

554人浏览过

|

来源于php中文网

原创

直接用 std::priority_queue 会出错,因其不支持修改已入队节点优先级;Dijkstra 需“更新”距离时只能重复入堆并跳过旧值,需初始化 dist 为 LLONG_MAX、用 long long 防溢出、检查不可达时输出 -1 而非原始值。

c++如何实现dijkstra最短路径算法_c++图论算法经典代码实现【算法】

为什么直接用 std::priority_queue 会出错?

因为 std::priority_queue 不支持修改已入队节点的优先级。Dijkstra 算法中,当发现更短路径时需“更新”某节点的距离,但标准堆无法定位并调整已有元素——只能重复插入新记录,靠后续弹出时跳过旧值来模拟更新。

实操建议:

  • 每次松弛成功(即找到更小距离)时,把 {new_dist, node_id} 推入堆,不删旧项
  • 出堆时检查 dist[node_id] 是否等于当前弹出的 new_dist,不等就 continue
  • 初始化 dist 数组为 LLONG_MAX 或足够大的数,dist[start] = 0

邻接表怎么建才不容易越界或漏边?

vector>> 存无向图/有向图最稳妥:外层索引是起点编号,内层每个 pair{to_node, weight}。注意节点编号是否从 0 开始——读题不仔细常导致访问 graph[n] 越界。

常见错误现象:

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

ThinkAny
ThinkAny

一个RAG驱动的AI搜索引擎,由独立开发者idoubi开发

下载
  • 输入边时写成 graph[u].push_back({v, w}) 却忘了无向图要补 graph[v].push_back({u, w})
  • 节点数为 n,但 graph 只 reserve 了 n-1 个 vector
  • 权重类型用 int,但题目有 1e9 边权 × 路径长 1e5 → 溢出,必须用 long long

如何处理不可达节点?

Dijkstra 本身不会给不可达节点赋“无穷大”以外的值,但你得主动判断。算法结束后,若 dist[target] == LLONG_MAX,说明不可达——不能直接输出该值,要按题目要求输出 -1 或特定字符串。

使用场景:

  • 单源多终点查询:跑一遍 Dijkstra 后批量查 dist[i]
  • 只查某终点:中途加个 if (u == target) break; 可提前退出(但注意不能省略松弛操作)
  • 需要路径还原:额外开 prev 数组记录前驱节点,回溯时用避免递归

std::priority_queue 的比较函数为什么常写成 greater

因为默认是大根堆,而 Dijkstra 需要每次取最小距离节点。priority_queue, vector<...>, greater<...>> 才是小根堆。如果手写 lambda,注意参数顺序和返回值:返回 true 表示前面的“优先级更低”,会被沉底。

性能影响:

  • greater 比自定义 lambda 略快(编译期确定)
  • 不要在循环里反复构造堆,声明一次复用
  • 如果图稀疏(边数 ≈ 节点数),堆操作主导复杂度;若稠密,邻接矩阵反而更稳(但空间 O(n²))
实际写的时候,最容易被忽略的是权重溢出和不可达判断的输出格式——这两处一错,整个样例就全挂。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

795

2023.08.22

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

258

2025.10.24

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

258

2025.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

402

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1510

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

633

2023.11.24

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

33

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.9万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 19.4万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号