벨만 포드 알고리즘(Bellman-Ford Algorithm)은 한 노드에서 다른 노드까지의 최단 거리를 구하는 알고리즘이다.
다익스트라 알고리즘이 모든 가중치가 양수인 경우에만 사용할 수 있는 반면에 벨만-포드 알고리즘은 노드 간의 간선 가중치가 음수인 경우에도 사용할 수 있다.
V - 1번만큼 탐색을 마쳤으므로 최단 거리 제약 한계에 도달했다. 이 다음 순회에서도 만약 갱신되는 값이 존재한다면 앞으로도 계속 갱신됨을 의미하므로 음수 사이클이 존재함을 의미한다.
우선 번만큼 순회하므로 가 되고 매번 총 만큼 탐색하므로 가 된다.
그런데 모든 노드에 간선이 연결되어 있다면 라면 는 에 근사해지므로 최악의 경우 이 된다. 이는 다익스트라 알고리즘이 최악의 경우 인 것과 비교했을 때 불리함을 알 수 있다. 따라서 벨만-포드 알고리즘은 간선의 가중치에 음수가 존재할 경우에만 채택해야 한다.
음의 간선이 존재하는 그래프 내에서 최단 경로를 찾는 벨만-포드 알고리즘을 활용하여 풀 수 있는 문제이다.
import sys
input = lambda : sys.stdin.readline().rstrip()
INF = 987654321
N, M = map(int, input().split())
edges = []
distance = [INF] * (N + 1)
for _ in range(M):
edges.append(tuple(map(int, input().split())))
def bf(start):
distance[start] = 0 # 시작 노드에 대해서 거리를 0으로 초기화
for i in range(N): # 정점 수만큼 반복
for j in range(M): # 매 반복 마다 모든 간선 확인
now, next, cost = edges[j]
# 현재 간선을 거려서 다른 노드로 이동하는 거리가 더 짧은 경우
if distance[now] != INF and distance[next] > distance[now] + cost:
if i == N - 1:
return True # n-1번 이후 반복에도 값이 갱신되면 음수 순환 존재
distance[next] = distance[now] + cost
return False
if bf(1):
print(-1)
else:
for i in range(2, N + 1):
print(distance[i] if distance[i] != INF else -1)