728x90
반응형
개요
벨만-포드(Bellman-Ford) 알고리즘은 음수 가중치 간선이 있는 그래프에서도 시작 노드로부터의 최단 경로를 찾을 수 있는 알고리즘이다. 다익스트라와 달리 우선순위 큐를 사용하지 않고, 간선 정보를 반복적으로 갱신하는 방식으로 동작한다. 또한, **음수 사이클(Negative Cycle)**의 존재 여부도 탐지할 수 있어, 금융 모델, 네트워크 분석 등에서도 유용하게 활용된다.
1. 개념 및 정의
벨만-포드 알고리즘은 하나의 시작 정점에서 다른 모든 정점까지의 최단 경로를 구하되, 음수 간선이 존재해도 정확한 결과를 보장한다. 각 간선을 V-1번 반복하면서 최단 거리를 갱신하며, 마지막 반복에서 거리값이 줄어들 경우 음수 사이클 존재로 간주한다.
2. 알고리즘 동작 원리
단계 | 설명 |
1단계 | 시작 정점의 거리를 0, 나머지는 ∞로 초기화 |
2단계 | 전체 간선을 V-1번 반복하며 각 간선의 거리값을 갱신 |
3단계 | (선택적) V번째 반복을 수행해 거리값이 감소하면 음수 사이클 판단 |
모든 간선에 대해 완전탐색을 반복하는 것이 핵심 구조이다.
3. 파이썬 구현 예시
def bellman_ford(graph, V, start):
distance = [float('inf')] * V
distance[start] = 0
for _ in range(V - 1):
for u, v, w in graph:
if distance[u] != float('inf') and distance[u] + w < distance[v]:
distance[v] = distance[u] + w
# 음수 사이클 존재 확인
for u, v, w in graph:
if distance[u] != float('inf') and distance[u] + w < distance[v]:
return None # 음수 사이클 존재
return distance
graph는 (출발, 도착, 가중치)의 리스트로 구성되며, O(VE) 복잡도를 가진다.
4. 시간 및 공간 복잡도
항목 | 복잡도 |
시간 복잡도 | O(VE) |
공간 복잡도 | O(V) |
모든 간선에 대해 V-1회 반복하므로 대규모 그래프에는 느릴 수 있다.
5. 벨만-포드 vs 다익스트라 비교
항목 | 벨만-포드 | 다익스트라 |
음수 간선 처리 | 가능 | 불가능 |
음수 사이클 탐지 | 가능 | 불가능 |
시간 복잡도 | O(VE) | O((V+E)logV) (우선순위 큐 사용 시) |
우선순위 큐 사용 | X | O |
적용 상황 | 복잡한 가중치/음수 포함 문제 | 빠른 일반적인 최단경로 계산 |
두 알고리즘은 문제의 제약 조건에 따라 선택해야 한다.
6. 활용 사례
분야 | 활용 예시 |
금융 시스템 | 차익 거래 탐지 (음수 사이클 기반) |
네트워크 보안 | 비용 변화 기반 침입 탐지 분석 |
통신 프로토콜 | RIP(Routing Information Protocol) 기반 경로 탐색 |
경쟁 게임 AI | 행동 비용이 음수일 수 있는 게임 맵 탐색 |
알고리즘 문제풀이 | 음수 간선 또는 사이클 판별 문제 |
음수 간선이 존재하거나, 사이클 여부 판단이 필요한 문제에 효과적이다.
7. 결론
벨만-포드 알고리즘은 음수 가중치 처리 및 음수 사이클 탐지가 가능한 유일한 대표 알고리즘으로, 다익스트라 알고리즘이 적용되지 않는 경우 유용하게 사용된다. 다소 느릴 수 있지만 정확성이 보장되며, 금융, 네트워크, 시뮬레이션 등 다양한 영역에서 폭넓게 활용된다. 복잡한 그래프 조건이 있는 문제를 다룰 때 반드시 이해하고 있어야 할 필수 알고리즘이다.
728x90
반응형
'Topic' 카테고리의 다른 글
A* 알고리즘(A-star Algorithm) (1) | 2025.03.28 |
---|---|
플로이드-워셜(Floyd-Warshall) 알고리즘 (0) | 2025.03.28 |
다익스트라(Dijkstra) 알고리즘 (0) | 2025.03.28 |
DFS 알고리즘(Depth-First Search) (1) | 2025.03.28 |
BFS 알고리즘(Breadth-First Search) (0) | 2025.03.28 |