[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法

[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第1张图片
在 BFS 中:
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第2张图片
Dijska 算法中使用优先队列:
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第3张图片
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第4张图片
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第5张图片
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第6张图片
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第7张图片
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第8张图片
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第9张图片
A 到 F 最短路径为:
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第10张图片
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第11张图片
[Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_第12张图片
Dijkstra 代码如下:

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}
}
import heapq

def init_distance(graph, startNode):
    distance = {startNode : 0}
    for vertex in graph:
        if vertex != startNode:
            distance[vertex] = float('inf')
    return distance

def Dijkstra(graph, startNode):
    pqueue = []
    heapq.heappush(pqueue, (0, startNode))
    seen = set()
    parents = {startNode : None}
    distance = init_distance(graph, startNode)

    while (len(pqueue) > 0):
        pair = heapq.heappop(pqueue)
        dist = pair[0]
        vertex = pair[1]
        seen.add(vertex)

        nodes = graph[vertex].keys()
        for w in nodes:
            if w not in seen:
                if dist + graph[vertex][w] < distance[w]:
                    heapq.heappush(pqueue, (dist + graph[vertex][w], w))
                    parents[w] = vertex
                    distance[w] = dist + graph[vertex][w]

    return parents, distance

parent , distance = Dijkstra(graph, "A")
print(parent)
print(distance)

你可能感兴趣的:(算法,数据结构)