from math import inf
from binary_tree.PrioQueue import PrioQueue
def dijkstra_shortest_paths(graph,v0):
vnum = graph.vertex_num()
assert 0 <= v0 < vnum # 第几个节点
paths = [None]*vnum
count = 0
cands = PrioQueue([(0,v0,v0)]) # (p,v,v') 初始序列
while count<vnum and not cands.is_empty():
plen, u, vmin = cands.dequeue() # 取路径最短顶点
if paths[vmin]:
"""如果其最短路径已知则继续"""
continue
paths[vmin] = (u,plen) # 记录新确定的最短路径
for v, w in graph.out_edges(vmin):
"""考察经由新U顶点的路径"""
if not paths[v]:
"""是到尚未知最短路径的顶点的路径,记录它"""
cands.enqueue((plen+w),vmin,v)
count +=1
return paths
def all_shortest_paths(graph):
vnum = graph.vertex_num()
a = [[graph.get_edge(i,j) for j in range(vnum)] for i in range(vnum)] # create a copy
nvertex = [[-1 if a[i][j] == inf else j for j in range(vnum)]
for i in range(vnum)]
for k in range(vnum):
for i in range(vnum):
for j in range(vnum):
if a[i][j] > a[i][k] + a[k][j]:
a[i][j] = a[i][k] + a[k][j]
nvertex[i][j] = nvertex[i][k]
return (a,nvertex)