[python] 벨만-포드 알고리즘
벨만-포드 알고리즘은 그래프에서 최단 경로를 찾기 위해 사용되는 알고리즘 중 하나입니다. 이 알고리즘은 음의 가중치를 가진 그래프에서도 동작하며, 가중치의 합이 음수 싸이클이 없을 경우에만 최단 경로를 구할 수 있습니다.
알고리즘 동작 원리
벨만-포드 알고리즘은 시작 정점에서부터 모든 다른 정점까지의 최단 경로를 차례대로 구하는 방식으로 동작합니다. 각 정점까지의 최단 경로는 이전 정점까지의 최단 경로와 현재 정점까지의 가중치를 더한 값으로 갱신됩니다. 이 과정을 모든 정점에 대해 반복하면, 마지막 반복에서 최단 경로가 최종적으로 결정됩니다.
구현 예제
다음은 파이썬으로 벨만-포드 알고리즘을 구현한 예제입니다.
def bellman_ford(graph, start):
# 정점들의 거리를 초기화
distance = {node: float('inf') for node in graph}
distance[start] = 0
# 모든 간선에 대해 반복적으로 최단 거리를 업데이트
for _ in range(len(graph) - 1):
for node in graph:
for neighbor, weight in graph[node].items():
if distance[node] != float('inf') and distance[node] + weight < distance[neighbor]:
distance[neighbor] = distance[node] + weight
# 음의 사이클 확인
for node in graph:
for neighbor, weight in graph[node].items():
if distance[node] != float('inf') and distance[node] + weight < distance[neighbor]:
raise Exception("음의 사이클이 존재합니다.")
return distance
위의 예제에서 graph
는 그래프를 나타내는 딕셔너리입니다. 각 정점을 키로 가지고, 인접한 정점과 그 가중치를 값으로 가지고 있습니다. start
는 시작 정점을 나타냅니다. bellman_ford
함수는 시작 정점부터 모든 정점까지의 최단 거리를 반환합니다.
시간 복잡도
벨만-포드 알고리즘의 시간 복잡도는 O(V*E)입니다. V는 정점의 개수이고, E는 간선의 개수입니다. 따라서 그래프의 크기가 매우 큰 경우에는 성능 문제가 발생할 수 있습니다.
결론
벨만-포드 알고리즘은 음의 가중치를 가진 그래프에서도 최단 경로를 찾을 수 있는 알고리즘입니다. 하지만 시간 복잡도가 크기 때문에 그래프의 크기가 큰 경우에는 성능 문제가 발생할 수 있으므로 주의해야 합니다.