直接用 std::priority_queue 会出错,因其不支持修改已入队节点优先级;Dijkstra 需“更新”距离时只能重复入堆并跳过旧值,需初始化 dist 为 LLONG_MAX、用 long long 防溢出、检查不可达时输出 -1 而非原始值。
为什么直接用 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++免费学习笔记(深入)”;