프로그래밍/백준

백준 1956 운동 - 파이썬

터렛짓는다 2021. 7. 27. 17:53

문제.

풀이.

플로이드-와샬 알고리즘을 통해 최단 거리를 구한 뒤

자기 자신에게 돌아오는 값 중 최솟값을 출력한다.

사이클이 없으면 -1

 

소스코드.

import sys
input = sys.stdin.readline

def floyd_whashall():
    # k = 경유지
    for k in range(1, V+1):
        # i = 출발지
        for i in range(1, V+1):
            # j = 목적지
            for j in range(1, V+1):
                if graph[i][j] > graph[i][k] + graph[k][j]:
                    graph[i][j] = graph[i][k] + graph[k][j]


V, E = map(int, input().split())
inf = float('inf')
graph = [[inf for i in range(V+1)] for j in range(V+1)]

for i in range(E):
    a, b, c = map(int, input().split())
    graph[a][b] = c

floyd_whashall()
result = inf

# 사이클은 자신한테 출발해 자신으로 돌아오기 때문에 graph[i][i]
for i in range(1, V+1):
    result = min(result, graph[i][i])

print(result if result != inf else -1)