✏️ 벨만 포드 알고리즘 (Bellman-Ford)
개념
- 한 노드에서 다른 노드까지의 최단 거리를 구하는 알고리즘
특징
- 음수 간선이 포함된 상황에서의 최단 거리 문제에서 활용
- 모든 간선의 비용이 양수일 때는 다익스트라 최단 경로 알고리즘 사용
- 음수 감선 순환 감지 가능
- 다익스트라 알고리즘에 비해 느림
동작 과정

- 출발 노드 설정
- 최단 거리 테이블 초기화
- 다음 과정 N - 1번 반복
- 전체 간선 E개를 하나씩 확인
- 각 간선을 거쳐 다른 노드로 가는 비용을 계산해 최단 거리 테이블 갱신
- 만약 음수 간선 순환이 발생하는지 확인하고 싶다면 3번 과정 1번 더 수행
- 최단 거리 테이블이 갱신된다면 음수 간선 순환이 존재하는 것
VS 다익스트라 알고리즘
- 다익스트라 알고리즘
- 매번 방문하지 않은 노드 중 최단 거리가 가장 짧은 노드 선택
- 음수 간선이 없다면 최적의 해를 찾을 수 있음
- 벨만 포드 알고리즘
- 매번 모든 간선을 전부 확인
- 따라서 다익스트라 알고리즘에서의 최적의 해를 항상 포함
- 다익스트라 알고리즘에 비해 시간이 오래 걸리지만 음수 간선 순환 탐지 가능
소스 코드 (Python)
import sys
input = sys.stdin.readline
INF = int(1e9)
n, m = map(int, input().split())
edges = []
distance = [INF] * (n + 1)
for _ in range(m):
a, b, c = map(int, input().split())
edges.append((a, b, c))
def bf(start):
distance[start] = 0
for i in range(n):
for j in range(m):
cur_node = edges[j][0]
next_node = edges[j][1]
edge_cost = edges[j][2]
if distance[cur_node] != INF and distance[next_node] > distance[cur_node] + edge_cost:
distance[next_node] = distance[cur_node] + edge_cost
if i == n - 1:
return True
return False
negative_cycle = bf(1)
if negative_cycle:
print("-1")
else:
for i in range(2, n + 1):
if distance[i] == INF:
print("-1")
else:
print(distance[i])
성능 분석