[BOJ 11657] 타임머신(Python)
문제
문제 해설
벨만 포드 알고리즘의 가장 기본적인 문제이므로 알고리즘을 알고 있다면 풀 수 있습니다.
풀이 코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
edges = []
inf = 1e9
dist = [inf] * (n + 1)
dist[1] = 0 # 1번 노드에서 출발
for _ in range(m):
a, b, c = map(int, input().split())
edges.append((a, b, c))
# 음의 가중치가 존재하기 때문에 다익스트라 사용 불가.
def bellman_ford():
# 모든 간선을 n-1번 순회하면 음의 순환이 없다는 가정하에
# 모든 노드까지의 최단 거리를 구할 수 있다.
# 그러니 총 n번을 순회하고 마지막 n번에 값이 바뀐다면
# 가중치가 음수인 간선들이 무한 루프를 도는 것이다.
for i in range(n):
for a, b, c in edges:
# 무한이 아니고, 현재 노드를 거쳐 가는 것이 더 비용이 적으면 갱신
if dist[a] != inf and dist[b] > dist[a] + c:
if i == n - 1: # n번째에 갱신된 경우
return False
dist[b] = dist[a] + c
return True
if not bellman_ford():
print(-1)
else:
for x in dist[2:]:
print(x) if x != inf else print(-1)
Author And Source
이 문제에 관하여([BOJ 11657] 타임머신(Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@qweadzs/BOJ-11657-타임머신Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)