《面试》-- 简单使用Python解决图结构的最小路径 -- Dijkstra算法
作者:互联网
写在前面
在你观看这篇博客之前,我必须种草、安利一个讲DFS、BFS、Dijkstra的视频,非常建议想学习经典图算法的猴子去看看,时间不长但是很精辟别忘了点赞啊,链接:https://www.bilibili.com/video/av25829980?from=search&seid=12399862396157246554
回归正题
图如图所示,假设起点为A,找出起点到剩下各个点的最短路径。
思路:本人肤浅,只知道Dijkstra算法就是专门用来解决这个问题,直接用Dijkstra就可以了。
过程:
代码:
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):
assert isinstance(Graph, dict)
assert isinstance(start, str)
assert start in Graph.keys()
# 使用优先队列实现
pqueue = []
heapq.heappush(pqueue, (0, start)) # 优先队列入队元素(距离,节点)
seen = set()
parent = {start: None} # 记录每个节点的父节点
distance = {start: 0} # 记录开始节点到各个节点的最短距离
while len(pqueue) > 0:
pair = heapq.heappop(pqueue) # 出队元素(距离,节点)
dist = pair[0] # 距离
vertex = pair[1] # 节点
if vertex in seen:
continue
seen.add(vertex) # 只有能出栈才加入集合中
nodes = Graph[vertex].keys() # 找出相邻节点
for w in nodes:
if w in seen:
continue
# 将当前节点的相邻节点加入优先队列中
heapq.heappush(pqueue, (Graph[vertex][w] + dist, w))
parent[w] = vertex
distance[w] = Graph[vertex][w] + dist
标签:pqueue,start,Python,Graph,vertex,面试,Dijkstra,节点 来源: https://blog.csdn.net/qq_18254385/article/details/100134288