迪杰斯特拉算法

本文介绍了迪杰斯特拉算法用于解决单源最短路径问题,并展示了两种不同的Python实现。第一种实现中存在可能的重复入队问题,第二种优化后的实现通过确保只有在找到最短路径时才入队,提高了效率。两种实现均在给定的图示例上成功运行,得出正确结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迪杰斯特拉算法

该算法用于求解单源最短路径问题

import heapq

graph = {
    "A": {"B": 5, "C": 1},
    "B": {"A": 5, "C": 2, "D": 1},
    "C": {"A": 1, "B": 2, "D": 4, "E": 8},
    "D": {"B": 1, "C": 4, "E": 3, "F": 6},
    "E": {"C": 8, "D": 3},
    "F": {"D": 6},
}


def __init_path_information(graph, start):
    distance = dict.fromkeys(graph.keys(), float("inf"))
    parent = dict.fromkeys(graph.keys(), None)
    for vertex in graph[start].keys():
        distance[vertex] = graph[start][vertex]
        parent[vertex] = start
    distance[start] = 0
    return distance, parent


def dijkstra(graph, start):
    priority_queue = []
    distance, parent = __init_path_information(graph, start)
    seen = dict.fromkeys(graph.keys(), False)
    heapq.heappush(priority_queue, (distance[start], start))

    while priority_queue:
        dist, vertex = heapq.heappop(priority_queue)
        seen[vertex] = True
        neighbors = graph[vertex].keys()

        for neighbor in neighbors:
            if not seen[neighbor]:
                if dist + graph[vertex][neighbor] < distance[neighbor]:
                    distance[neighbor] = dist + graph[vertex][neighbor]
                    parent[neighbor] = vertex
                heapq.heappush(priority_queue, (distance[neighbor], neighbor))
    return parent, distance


if __name__ == "__main__":
    parent, distance = dijkstra(graph, "A")
    print(parent, distance, sep="\n")

运行结果如下:
运行结果


上述代码看上去比较符合直觉,但其实还有优化的空间,因为只有当节点出队时,该节点才能被认为已经求得了最短路径。若对于某一节点,如果没有求出该节点的最短路,该节点就会一直入队,从而很可能会出现相同节点重复入队的现象 。为避免这一现象可将代码优化如下:

import heapq

graph = {
    "A": {"B": 5, "C": 1},
    "B": {"A": 5, "C": 2, "D": 1},
    "C": {"A": 1, "B": 2, "D": 4, "E": 8},
    "D": {"B": 1, "C": 4, "E": 3, "F": 6},
    "E": {"C": 8, "D": 3},
    "F": {"D": 6},
}


def dijkstra(graph, start):
    priority_queue = []
    distance = dict.fromkeys(graph.keys(), float("inf"))
    distance[start] = 0
    parent = {start: None}
    seen = dict.fromkeys(graph.keys(), False)
    heapq.heappush(priority_queue, (distance[start], start))

    while priority_queue:
        dist, vertex = heapq.heappop(priority_queue)
        seen[vertex] = True
        neighbors = graph[vertex].keys()

        for neighbor in neighbors:
            if not seen[neighbor]:
                if dist + graph[vertex][neighbor] < distance[neighbor]:
                    distance[neighbor] = dist + graph[vertex][neighbor]
                    parent[neighbor] = vertex
                    heapq.heappush(priority_queue,
                                   (distance[neighbor], neighbor))
    return parent, distance


if __name__ == "__main__":
    parent, distance = dijkstra(graph, "A")
    print(parent, distance, sep="\n")

运行结果如下,同样能得到正确的答案
优化后的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值