위의 그래프를 이차원 배열로 만들면 아래와 같다.
테이블이 의미하는 바는 현재까지 계산된 최소 비용 이다.
이차원 배열을 반복적으로 갱신하여 최종적으로 모든 최소 비용을 구해야 한다.
노드 N을 거쳐가는 경우 (= 노드 N을 중간노드로 설정한 경우 / ? -> N -> ?)
## 플로이드
import sys
from math import inf
input=sys.stdin.readline
n=int(input())
m=int(input())
res=[[inf]*n for _ in range(n)]
def floydWarshall():
for i in range(m):
a, b, c = map(int, input().split())
if res[a-1][b-1]>c:
res[a-1][b-1] = c
#res[a-1][b-1] = min(res[a-1][b-1], c)
for k in range(n): #k = 거쳐가는 노드
res[k][k]=0 #자기 자신의 노드는 0으로 처리
for i in range(n): #i = 출발 노드
for j in range(n): #j = 도착 노드
# res[i][j]=min(res[i][j], res[i][k]+res[k][j])
if res[i][k]+res[k][j] < res[i][j]:
res[i][j] = res[i][k] + res[k][j]
for i in range(n):
for j in range(n):
if res[i][j]==inf:
res[i][j]=0
print(res[i][j], end=' ')
print()
floydWarshall()