Python最短路径怎么求_Dijkstra算法与优先队列结合

张开发
2026/5/21 17:37:40 15 分钟阅读
Python最短路径怎么求_Dijkstra算法与优先队列结合
直接用 heapq 实现 Dijkstra 可能算错最短距离因 heapq 不支持动态更新权重旧条目残留导致重复松弛必须在出堆时检查 dist[u] 是否过期即 if d dist[u]: continue。为什么直接用 heapq 实现 Dijkstra 会算错最短距离因为 Python 的 heapq 不支持动态更新节点权重旧的过时条目仍留在堆里导致同一个节点被重复松弛、甚至误判为更短路径。典型现象是图中存在负权边时结果异常但注意——Dijkstra 本就不该用于负权图更常见的是某节点首次出堆后又被更低距离“唤醒”而你没做去重判断。必须在节点出堆时检查其距离是否已过期if dist[node] ! current_dist: continue初始化 dist 用 float(inf)起点设为 0邻接表推荐用 dict 套 list[tuple[neighbor, weight]]别用嵌套 dict 增加查找开销怎么写一个能跑通的 Dijkstra heapq 最小堆核心就三步建图、初始化距离数组、循环弹堆松弛。不需要封装类函数内联写反而更清晰。示例场景无向图节点编号从 0 到 n-1求从 start 到 end 的最短距离立即学习“Python免费学习笔记深入”import heapqpdef dijkstra(graph, start, end):n len(graph)dist [float(inf)] * ndist[start] 0heap [(0, start)]/ppre classbrush:python;toolbar:false;while heap: d, u heapq.heappop(heap) if d dist[u]: # 过期条目跳过 continue if u end: return d for v, w in graph[u]: new_dist d w if new_dist dist[v]: dist[v] new_dist heapq.heappush(heap, (new_dist, v))return -1 # 不连通/preheapq 和 queue.PriorityQueue 能混用吗不能。它们底层行为不一致PriorityQueue 是线程安全封装内部用 heapq但不暴露底层堆列表也没法做「跳过过期条目」的关键判断。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

更多文章