Python 实现 Dijkstra算法(O(n^2))
import numpy as np
def dijkstra(graph, node):
'''Dijkstra Algorithm'''
'''weight must >= 0'''
inf = int(1e9)
g = np.array(graph)
n = len(g)
d = np.repeat(inf, n)
visit = np.repeat(False, n).astype(np.bool)
for i in range(0, n):
for j in range(0, n):
g[i][j] = inf if g[i][j] == 0 else g[i][j]
for i in range(0, n):
d[i] = g[node][i]
visit[node] = True
d[node] = 0
for i in range(0, n):
tmp = inf
u = node
for j in range(0, n):
if not visit[j] and d[j] < tmp:
tmp = d[j]
u = j
visit[u] = True
for j in range(0, n):
if not visit[j]:
d[j] = min(d[j], d[u] + g[u][j])
return d
if __name__ == '__main__':
graph = [[0, 1, 12, 0, 0, 0], [1, 0, 9, 3, 0, 0],
[12, 9, 0, 4, 5, 0],[0, 3, 4, 0, 13, 15],
[0, 0, 5, 13, 0, 4], [0, 0, 0, 15, 4, 0]]
for i in range(0, len(graph)):
dis = dijkstra(graph, i)
print(dis)
[ 0 1 8 4 13 17]
[ 1 0 7 3 12 16]
[8 7 0 4 5 9]
[ 4 3 4 0 9 13]
[13 12 5 9 0 4]
[17 16 9 13 4 0]