Bellman Ford 알고리즘은 다익스트라 알고리즘을 개선시킨 알고리즘이다.
음의 사이클이 형성된 건 어떻게 아느냐?
정점 개수 N에 대하여 간선 최대 개수는 N-1이므로 모든 정점에 대하여 N-1번 반복하면 모두 갱신할 수 있다. 따라서 N번째 반복에서 최단 경로가 또 한번 갱신된다면 이는 무한히 갱신되는 음의 사이클이 형성되었음을 알 수 있음. 그래서 N번째 반복에서 갱신되면 사이클이 형성됐음을 알리는 False 출력, 아니면 정상적으로 갱신되었음을 알리는 True를 반환.
import sys
from math import inf
input = sys.stdin.readline
def BellmanFord():
dist[0], dist[1] = 0, 0
for n in range(N):
for start, end, d in edge:
cost = dist[start] + d
if cost < dist[end] and dist[start] != inf: # dist[x]=inf인 경우 최단 경로가 없음을 의미하므로 건너뛰기
dist[end] = cost
if n == N - 1:
return False
return True
if __name__ == '__main__':
N, M = map(int, input().split())
edge = [list(map(int, input().split())) for _ in range(M)]
dist = [inf for _ in range(N + 1)]
if BellmanFord():
for i in range(2, N + 1):
print(dist[i] if dist[i] != inf else -1)
else:
print(-1)