이호진

최단 경로 알고리즘 - 플로이드-워셜 - 2021/04/03 본문

주요 알고리즘

최단 경로 알고리즘 - 플로이드-워셜 - 2021/04/03

이호진 2021. 4. 3. 16:31

플로이드 워셜 알고리즘

 

플로이드 워셜 알고리즘은 모든 노드에서 다른 모든 노드까지의 최단 경로를 구할 때 이용한다

 

3차원 리스트를 이용하기 때문에 노드의 개수가 많을 땐 사용하기 힘들다.

 

점화식으로는 Dab=min(Dab,Dak+Dkb)로 나타 낼 수 있다. -> 동적 프로그래밍

 

import sys
input = sys.stdin.readline

n = int(input())
m = int(input())
INF = int(1e9)

graph = [[INF] * (n + 1) for i in range(n + 1)]
#이차원 리스트로 graph를 선언한다.
for i in range(1, n + 1):
    for j in range(1, n + 1):
        if i == j:
            graph[i][j] = 0
            #자기 자신으로의 거리를 0으로 초기화한다.
            
for i in range(m):
    a, b, c = map(int, input().split())
    graph[a][b] = c
    #a에서 b로 가는 경우의 비용은 c
    
for k in range(1, n + 1):
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
            #점화식을 이용해서 매 상황마다 값을 갱신한다.
            
for i in range(1, n + 1):
    for j in range(1, n + 1):
        if graph[i][j] == INF:
            print(0, end=' ')
        else:
            print(graph[i][j], end=' ')
    print()
    #행렬의 형태로 출력