当前位置:首页python > 正文

Python 算法:Dijkstra 最短路径算法(Dijkstra Algorithm)

作者:野牛程序员:2025-12-22 11:27:08python阅读 2005
Python 算法:Dijkstra 最短路径算法(Dijkstra Algorithm)
# /*
# Python 算法:Dijkstra 最短路径算法(Dijkstra Algorithm)
# --------------------------------------------------------
# 原理:
# Dijkstra 是一种贪心算法,用于求解带权非负图的单源最短路径问题。
#
# 基本思想:
# 1) 起点距离设为 0,其余设为无穷大;
# 2) 每一步从“未确定最短距离”的节点中选出距离最小的节点;
# 3) 使用该节点更新相邻节点的距离;
# 4) 重复操作直到所有节点都被确定最短路径。
#
# 使用前提:
# - 图中所有边的权值必须 >= 0
# - 适用于单源到所有点的最短路径问题
# */

import sys
import heapq

# --------------------------------------------------------
# 示例图(邻接表表示)
# 每个元素形如:graph[u] = [(v, weight), ...]
graph = [
    [(1, 2), (2, 5)],        # 0 号节点
    [(0, 2), (2, 4), (3, 6)],# 1
    [(0, 5), (1, 4), (3, 2)],# 2
    [(1, 6), (2, 2)]         # 3
]

# --------------------------------------------------------
# Dijkstra 算法实现
def dijkstra(graph, start):
    num_vertices = len(graph)
    dist = [sys.maxsize] * num_vertices   # 最短距离数组
    prev = [None] * num_vertices          # 前驱节点
    dist[start] = 0                       # 起点距离设为 0

    pq = [(0, start)]                     # 优先队列(最小堆)

    while pq:
        cur_dist, u = heapq.heappop(pq)

        # 若弹出的元素不是当前最优解,则跳过(堆中过期数据)
        if cur_dist != dist[u]:
            continue

        # 遍历相邻节点
        for v, weight in graph[u]:
            new_dist = cur_dist + weight
            if new_dist < dist[v]:
                dist[v] = new_dist
                prev[v] = u
                heapq.heappush(pq, (new_dist, v))

    return dist, prev

# --------------------------------------------------------
# 工具函数:恢复最短路径
def get_path(prev, target):
    path = []
    while target is not None:
        path.append(target)
        target = prev[target]
    return list(reversed(path))

# --------------------------------------------------------
# 演示:从 0 号节点出发求最短路径
distances, predecessors = dijkstra(graph, 0)

print("最短距离数组:", distances)
print("前驱数组:", predecessors)

print("\n从 0 到 3 的最短路径:", get_path(predecessors, 3))

# --------------------------------------------------------
# 输出示例(可能略有不同):
# 最短距离数组: [0, 2, 5, 7]
# 前驱数组: [None, 0, 0, 2]
#
# 从 0 到 3 的最短路径: [0, 2, 3]
#
# 要点总结:
# 1) 适用于求单源最短路径,要求边权非负;
# 2) 使用优先队列可将复杂度优化为 O((V + E) log V);
# 3) 前驱数组可恢复最短路径的路线;
# 4) 邻接表比邻接矩阵更适合稀疏图的高效实现。
# */


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • Python 算法:Dijkstra 最短路径算法(Dijkstra Algorithm)
  • 相关推荐

    最新推荐

    热门点击