import heapq
def heappath(edges):
dist = [float('inf')] * len(edges)
dist[0] = 0
pre=[-1 for _ in range(len(edges))]
q = []
heapq.heappush(q, [0, 0])
while q:
_, u = heapq.heappop(q)
for i in edges[u]:
if dist[i[0]] > dist[u] + i[1]:
dist[i[0]] = dist[u] + i[1]
pre[i[0]] = u
heapq.heappush(q, [dist[u] + i[1], i[0]])
return dist,pre
edges = (((1, 50), (2, 10), (4,45)),
((2, 15), (4, 5)),
((0, 20), (3, 15)),
((1, 20), (4, 35)),
((3, 30),),
((3, 3),),)
def dijkstra(e):
n = len(e)
dist=[[0,-1] for _ in range(n)]
a=[[float('inf') for _ in range(n)] for _ in range(n)]
for i in range(n):
a[i][i] = 0
for i in range(n):
for j in range(len(e[i])):
a[i][e[i][j][0]] = e[i][j][1]
dist[0][0]=0
dist[0][1]=0
a[0][0]=1
for i in range(1,n):
dist[i][0] = a[0][i]
if dist[i][0] != float('inf'):
dist[i][1] = 0
else:
dist[i][1] = -1
for i in range(1,n):
minw = float('inf')
min = 0
for j in range(1,n):
if a[j][j] == 0 and dist[j][0] < minw:
minw = dist[j][0]
min = j
if 0==min:break
a[min][min] = 1
for j in range(1,n):
if 1 == a[j][j]:continue
if dist[j][0]>dist[min][0]+a[min][j]:
dist[j][0] = dist[min][0]+a[min][j]
dist[j][1] = min
print(dist)
def floyd(e):
n = len(e)
a=[[float('inf') for _ in range(n)] for _ in range(n)]
nextvex=[[-1 for _ in range(n)] for _ in range(n)]
for i in range(n):
a[i][i] = 0
nextvex[i][i] = i
for i in range(n):
for j in range(len(e[i])):
a[i][e[i][j][0]] = e[i][j][1]
nextvex[i][e[i][j][0]] = e[i][j][0]
for k in range(n):
for i in range(n):
for j in range(n):
if float('inf') == a[i][k] or float('inf') == a[k][j]:continue
if a[i][j]>(a[i][k]+a[k][j]):
a[i][j] = a[i][k]+a[k][j]
nextvex[i][j] = nextvex[i][k]
print(a)
print(nextvex)
'''
[[0, 50, 10, inf, 45, inf],
[inf, 0, 15, inf, 5, inf],
[20, inf, 0, 15, inf, inf],
[inf, 20, inf, 0, 35, inf],
[inf, inf, inf, 30, 0, inf],
[inf, inf, inf, 3, inf, 0]]
[[0, 1, 2, -1, 4, -1],
[-1, 1, 2, -1, 4, -1],
[0, -1, 2, 3, -1, -1],
[-1, 1, -1, 3, 4, -1],
[-1, -1, -1, 3, 4, -1],
[-1, -1, -1, 3, -1, 5]]
'''
