算法与数学建模 dijkstra-path

Dijkstra 最短路径

手写 Dijkstra 最短路径,优先队列加路径回溯,附内置断言。

  • Python
  • 难度入门
  • 未提供
  • 许可证MIT

收录于 2026-10-18 · 最后核对 2026-10-18

概览

所有字段以收录时的公开信息为准

项目名称
Dijkstra 最短路径
原始名称
未提供
别名
Dijkstra 最短路径、最短路径、路径规划、图算法、单源最短路径
一句话简介
手写 Dijkstra 最短路径,优先队列加路径回溯,附内置断言。
详细介绍

单文件实现邻接表建图、优先队列取最小距离、松弛更新和路径回溯。示例图跑完会输出完整路径与总长度,并用断言校验结果。只依赖 Python 标准库,适合对照课本推导边看边跑。

分类
算法与数学建模
语言
Python
技术栈
未提供
上手难度
入门
Star 数
未提供
许可证
MIT
作者
开源拾遗

获取方式

优先使用原始仓库

本项目通过以下方式获取:站内代码片段

站内代码片段 67 行

文件snippets/dijkstra-path.py

dijkstra-path.py
"""Dijkstra 最短路径 —— 站内原创示例代码

用途:给定带权无向图,求两个节点之间的最短路径。
适用:路径规划、图论作业、导航算法入门。
依赖:仅 Python 标准库(heapq)。
运行:python dijkstra-path.py
许可:MIT(开源拾遗原创,可自由使用与修改)
"""

import heapq


def dijkstra(graph, start):
    """返回 (最短距离表, 前驱表)。graph 形如 {节点: [(邻居, 权重), ...]}。"""
    dist = {node: float("inf") for node in graph}
    prev = {node: None for node in graph}
    dist[start] = 0
    visited = set()
    queue = [(0, start)]

    while queue:
        d, u = heapq.heappop(queue)
        if u in visited:
            continue
        visited.add(u)
        for v, weight in graph[u]:
            candidate = d + weight
            if candidate < dist[v]:
                dist[v] = candidate
                prev[v] = u
                heapq.heappush(queue, (candidate, v))

    return dist, prev


def shortest_path(graph, start, end):
    """返回 (路径列表, 总长度);不可达时返回 (None, inf)。"""
    dist, prev = dijkstra(graph, start)
    if dist.get(end, float("inf")) == float("inf"):
        return None, float("inf")

    path = []
    cur = end
    while cur is not None:
        path.append(cur)
        cur = prev[cur]
    return path[::-1], dist[end]


if __name__ == "__main__":
    # 一张小地图:节点是地点,边是距离
    graph = {
        "A": [("B", 4), ("C", 2)],
        "B": [("A", 4), ("C", 1), ("D", 5)],
        "C": [("A", 2), ("B", 1), ("D", 8), ("E", 10)],
        "D": [("B", 5), ("C", 8), ("E", 2)],
        "E": [("C", 10), ("D", 2)],
    }

    path, total = shortest_path(graph, "A", "E")
    print("最短路径:", " -> ".join(path))
    print("总长度:", total)

    # 自检:结果应为 A -> C -> B -> D -> E,长度 10
    assert path == ["A", "C", "B", "D", "E"], path
    assert total == 10, total
    print("断言通过")

站内原创示例代码,仅演示核心思路,许可证为 MIT。本条目为站内整理内容,未提供原始仓库地址。

安装与运行

命令均来自公开资料

环境与依赖

  • Python 3.9+
安装命令 未提供
运行命令
python snippets/dijkstra-path.py

数据与硬件

未核实的字段不会编造

数据集说明
未提供
硬件要求
未提供

运行验证状态

四态徽章

实验已验证

已按说明完成安装、启动,并跑通实验或核心流程,结果可复现。

  1. 未测试
  2. 依赖安装已测试
  3. 基本启动已测试
  4. 实验已验证

说明:只有真正执行过对应步骤才会升级状态;未测试 表示仅核对了公开信息。

当前状态
实验已验证
最后核对
2026-10-18
核对版本
待核实
验证说明

已在本机 Python 3.14.6 实际运行:A→C→B→D→E,总长度 10,内置断言通过。

许可证与引用

转载与引用请保留出处

许可证
MIT
作者 / 组织
开源拾遗
原始仓库
未提供
核对版本
待核实
最后核对
2026-10-18
收录日期
2026-10-18

引用建议

Dijkstra 最短路径 / 开源拾遗. 《开源拾遗》收录,收录日期 2026-10-18,最后核对 2026-10-18. 许可证:MIT.

许可证以原始仓库的 LICENSE 文件为准;本站不对许可证做法律判断。