코드

n = int(input())
m = int(input())

INF = int(1e9)
graph = [[INF] * (n+1) for _ in range(n+1)]

# 자기 자신으로 가는 비용 0
for a in range(1, n+1):
    for b in range(1, n+1):
        if a == b:
            graph[a][b] = 0
         
        
# 간선 간의 연결 정보 및 이동 비용 입력    
for _ in range(m):
    a, b, c = map(int, input().split())
    
    # 최소 비용만 고려할 것이므로 가장 작은 값만 그래프에 담는다
    if c < graph[a][b] :
        graph[a][b] = c
        
# 플로이드 워셜 구현
for k in range(1, n+1):
    for a in range(1, n+1):
        for b in range(1, n+1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
            
# 문제 요구 출력 방식            
for a in range(1, n+1):
    for b in range(1, n+1):
        
        # 도달할 수 없으면 0
        if graph[a][b] == INF:
            print(0, end = ' ')
        else:
            print(graph[a][b], end = ' ')
        
    print()                    

문제 해설

전형적인 플로이드 워셜 알고리즘 문제이다.

최단 경로 알고리즘 중 비교적 간단하게 해결할 수 있는 알고리즘으로 DP의 원리를 이용하여 거쳐가는 노드를 기준으로 최단 거리 테이블을 갱신하는 방식으로 동작한다.

댓글남기기