1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def dijkstra(E, n0):
v_size = len(E)
l=[1e5]*v_size
l[n0]=0
s = [n0]
s_hat = [i for i in range(v_size)]
s_hat.remove(n0)
parent = [-1]*v_size

while s_hat:
d = 1e5
index_u, index_v = -1, -1
for u in s:
for v in s_hat:
d_uv = l[u]+E[u][v]
if d > d_uv:
d = d_uv
index_u = u
index_v = v
l[index_v]=d
parent[index_v] = index_u
s.append(index_v)
s_hat.remove(index_v)
print('next')
print(s, s_hat)
print(l, d, index_v)
print(index_u, index_v)

return l, parent


if __name__=='__main__':
E = [[0,5,2,1e5],[5,0,7,3],[2,7,0,1],[1e5,3,1,0]]

l,p = dijkstra(E,1)
print(l, p)


# 输出
next
[1, 3] [0, 2]
[100000.0, 0, 100000.0, 3] 3 3
1 3
next
[1, 3, 2] [0]
[100000.0, 0, 4, 3] 4 2
3 2
next
[1, 3, 2, 0] []
[5, 0, 4, 3] 5 0
1 0
[5, 0, 4, 3] [1, -1, 3, 1]