用python实现Dijkstra算法

import heapq

def dijkstra(graph, start):
    # 初始化距离字典和前驱字典
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    prev = {node: None for node in graph}

    # 使用堆来存储未处理的节点
    heap = [(dist[node], node) for node in graph]
    heapq.heapify(heap)

    while heap:
        # 从堆中弹出距离最小的节点
        current_dist, current_node = heapq.heappop(heap)

        # 如果当前节点的距离已经比之前计算的距离更长,则忽略它
        if current_dist > dist[current_node]:
            continue

        # 遍历当前节点的邻居节点,更新距离和前驱
        for neighbor, weight in graph[current_node].items():
            new_dist = dist[current_node] + weight
            if new_dist < dist[neighbor]:
                dist[neighbor] = new_dist
                prev[neighbor] = current_node
                heapq.heappush(heap, (new_dist, neighbor))

    # 返回最短路径距离字典和前驱字典
    return dist, prev

在这个示例代码中,我们定义了一个dijkstra()函数,它接受一个字典类型的图和起点作为输入,返回最短路径距离字典和前驱字典。

首先,我们初始化了距离字典和前驱字典,将起点的距离设为0,将所有其他节点的距离设为正无穷。然后,我们使用堆来存储未处理的节点,将起点加入堆中。

接下来,我们进入一个循环,每次从堆中弹出距离最小的节点,遍历该节点的邻居节点,更新距离和前驱。如果更新后的距离小于之前计算的距离,就将邻居节点的距离和前驱更新,并将其加入堆中。

最后,我们返回最短路径距离字典和前驱字典。

以下是一个使用示例:

graph = {
    'A': {'B': 6, 'C': 3},
    'B': {'A': 6, 'D': 1},
    'C': {'A': 3, 'D': 4},
    'D': {'B': 1, 'C': 4, 'E': 2},
    'E': {'D': 2}
}

dist, prev = dijkstra(graph, 'A')
print(dist)
print(prev)

你可能感兴趣的:(Python,算法)