import heapq
import math
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_distance(graph,s):
distance={s:0}
for v in graph:
if v!=s:
distance[v]=math.inf
return distance
print(init_distance(graph,"A"))
def dijkstra(graph,s):
pqueue=[]
heapq.heappush(pqueue,(0,s))
seen= set()
parent={s:None}
distance=init_distance(graph,'A')
while( len(pqueue)>0 ):
pair= heapq.heappop(pqueue)
dist= pair[0]
v = pair[1]
seen.add(v)
nodes = graph[v].keys()
for n in nodes:
if n not in seen:
if dist+ graph[v][n]< distance[n]:
heapq.heappush(pqueue,(dist+graph[v][n],n))
parent[n]=v
distance[n]= dist+ graph[v][n]
return parent,distance
parent,distance= dijkstra(graph,"A")
print(parent,distance)
BFS算法扩展。将queue方式换成优先队列。
dijkstra算法:从图上一点到另一点最短路径,图为DAG,带权或路径长度。
从优先队列里拿取没有拿出来的,更新parent数组和distance数组,parent数组的个元素表示为链表。distance为原点到个个节点的路径长度。
本文深入解析了Dijkstra算法,一种用于解决带权图中单源最短路径问题的经典算法。通过使用优先队列优化,提高了算法效率。文章详细介绍了算法的实现过程,包括初始化距离、维护优先队列、更新距离和父节点等关键步骤。
172万+

被折叠的 条评论
为什么被折叠?



