모든 노드에 대한 해당 노드를 중간 지점으로 거쳐갈 때와 거쳐가지 않을 때의 거리를 비교하여 더 짧은 값으로 테이블을 갱신한다.
구현
INF = int(1e9)
def floyd_warshall(graph, shortest):
for i in range(1, len(graph)):
shortest[i][i] = 0
for j in graph[i]:
shortest[i][j[0]] = j[1]
for k in range(1, len(graph)):
for i in range(1, len(graph)):
for j in range(1, len(graph)):
shortest[i][j] = min(shortest[i][j], shortest[i][k] + shortest[k][j])
node, edge = 6, 11
start = 1
graph = [[] for _ in range(node+1)]
shortest = [[INF]*(node+1) for _ in range(node+1)]
data = [
(1, 2, 2), # 1번에서 2번으로 가는 비용이 2
(1, 3, 5),
(1, 4, 1),
(2, 3, 3),
(2, 4, 2),
(3, 2, 3),
(3, 6, 5),
(4, 3, 3),
(4, 5, 1),
(5, 3, 1),
(5, 6, 2)
]
for i in data:
a, b, c = i
graph[a].append((b, c))
floyd_warshall(graph, shortest)
for i in range(1, node+1):
for j in range(1, node+1):
print(format(shortest[i][j], "3") if shortest[i][j] != INF else 'INF', end=" ")
print()