-
[Algorithm] 벨만-포드(Bellman-ford) 알고리즘Algorithm/Concepts 2024. 10. 23. 15:00
벨만-포드(Bellman-ford) 알고리즘이란?
벨만-포드 알고리즘은 최단 경로 알고리즘 중 하나로, 그래프 내의 모든 정점에서 특정 시작 정점까지의 최단 경로를 찾는 알고리즘이다. 특히, 음수 가중치를 가진 간선이 있는 그래프에서도 작동하며, 음수 사이클을 감지할 수 있다.
시간복잡도
벨만-포드 알고리즘의 시간 복잡도는 O(V * E)이다. 여기서 V는 정점의 수, E는 간선의 수를 의미한다. 이 시간 복잡도는 모든 간선에 대해 번의 반복을 수행하는 것에서 비롯된다.
벨만-포드 알고리즘의 기본 원리
- 초기화:
- 시작 정점을 제외한 모든 정점까지의 거리를 무한대(∞)로 설정
- 시작 정점의 거리는 0으로 설정
- 계산:
- 그래프의 모든 간선에 대해 정점을 반복적으로 탐색
- 각 간선을 검사하여, 해당 간선을 통해 더 짧은 경로가 존재하면 그 경로로 거리를 갱신
- 이 과정을 정점 수 번 반복. 번을 넘어서도 경로가 갱신되면, 음수 가중치 사이클이 존재하는 것을 의미
예시
# 벨만-포드 알고리즘 구현 def bellman_ford(n, edges, start): # 시작 정점에서 모든 정점까지의 거리 배열 distance = [float('inf')] * n distance[start] = 0 # 정점 수 - 1 번 반복 for _ in range(n - 1): for u, v, weight in edges: if distance[u] != float('inf') and distance[u] + weight < distance[v]: distance[v] = distance[u] + weight # 음수 사이클 탐지 for u, v, weight in edges: if distance[u] != float('inf') and distance[u] + weight < distance[v]: print("음수 사이클이 존재합니다.") return None return distance # 예시 그래프: (정점1, 정점2, 가중치) edges = [ (0, 1, -1), (0, 2, 4), (1, 2, 3), (1, 3, 2), (1, 4, 2), (3, 2, 5), (3, 1, 1), (4, 3, -3) ] n = 5 # 정점의 수 start = 0 # 시작 정점 distance = bellman_ford(n, edges, start) if distance: print("최단 거리:", distance)
최단 거리: [0, -1, 2, -2, 1]
'Algorithm > Concepts' 카테고리의 다른 글
[Algorithm] 프림(Prim) 알고리즘 (0) 2024.09.22 [Algorithm] 크루스칼(Kruskal) 알고리즘 (0) 2024.09.22 [Algorithm] 유니온-파인드(Union-Find) 알고리즘 (3) 2024.09.16 [Algorithm] 비트마스킹(Bitmask) 알고리즘 (5) 2024.09.02 [Algorithm] 플로이드-워셜(Floyd-Warshall) 알고리즘 (0) 2024.08.31 - 초기화: