알고리즘
DFS/BFS
[11657] 타임머신
by Hwang
문제
https://www.acmicpc.net/problem/11657
풀이
최단 거리를 효율적으로 구할 수 있는 알고리즘으로 다익스트라 알고리즘이 있지만 음의 가중치가 존재한다면 정확한 최단 거리를 구할 수 없습니다. 이 문제에는 음의 가중치를 가진 간선이 존재하므로 벨만 포드 알고리즘을 이용해서 풀 수 있습니다.
N-1번 반복하며 모든 간선을 확인하면서 최단 거리를 구하는 방식입니다. 여기서 N-1번 반복하는 이유는 최단 거리를 찾기 위한 길이가 최대 N-1이기 때문입니다.
음의 가중치가 존재하는 그래프는 음수 사이클이 존재할 수 있습니다. 만약 음수 사이클이 존재한다면 최단 거리는 한 없이 작아지기 때문에 값을 구할 수 없게됩니다. 따라서 N-1 번의 반복 후에도 최단 거리가 갱신되는지 확인해주어야합니다.
import sys
N, M = map(int, sys.stdin.readline().split())
edges = [list(map(int, sys.stdin.readline().strip().split()))for _ in range(M)]
dist = [sys.maxsize] * (N + 1)
def bf(start):
dist[start] = 0
for i in range(N):
for j in range(M):
s, e, cost = edges[j]
if dist[s] != sys.maxsize and dist[s] + cost < dist[e]:
dist[e] = dist[s] + cost
if i == N - 1: # 음수 사이클 확인
return False
return True
if bf(1):
for i in dist[2:]:
print(i if i != sys.maxsize else -1)
else:
print(-1)
Comment