[파이썬] 벨만-포드 알고리즘의 개념과 활용

벨만-포드 알고리즘은 그래프의 최단 경로를 찾는 알고리즘 중 하나입니다. 이 알고리즘은 다익스트라 알고리즘과 마찬가지로 단일 출발점 최단 경로를 구하는데 사용됩니다. 그러나 벨만-포드 알고리즘은 음수 가중치를 갖는 간선을 다룰 수 있다는 점에서 다익스트라 알고리즘과 차이가 있습니다.

알고리즘의 개념과 동작 원리

벨만-포드 알고리즘은 최단 거리를 갱신하는 과정을 반복하여 최적의 결과를 찾아냅니다. 알고리즘의 동작 원리는 다음과 같습니다.

  1. 출발 노드를 설정하고, 출발 노드의 최단 거리를 0으로 설정합니다.
  2. 모든 간선에 대해 최단 거리를 갱신하는 과정을 N-1번 반복합니다. (N은 노드의 개수)
  3. N번째 반복에서도 최단 거리가 갱신된다면, 음수 사이클이 존재하는 것이므로 최적의 결과를 찾을 수 없습니다.

벨만-포드 알고리즘은 각 반복마다 모든 간선을 확인하고 최단 거리를 갱신하는 과정을 수행합니다. 이 과정은 다익스트라 알고리즘과 비교하여 상대적으로 시간이 오래 걸리지만, 음수 가중치를 다룰 수 있다는 점에서 유용하게 사용될 수 있습니다.

알고리즘의 활용

벨만-포드 알고리즘은 다양한 실제 문제에 활용될 수 있습니다. 일반적으로 음수 가중치가 존재하는 그래프에서 최단 경로를 찾을 때 사용되며, 예를 들어 다음과 같은 상황에서 활용될 수 있습니다.

Python을 활용한 벨만-포드 알고리즘 구현

다음은 Python을 사용하여 벨만-포드 알고리즘을 구현한 예시 코드입니다.

def bellman_ford(graph, start):
    # 노드의 개수
    nodes = len(graph)
    # 시작 노드에서의 최단 거리를 무한대로 초기화
    distance = [float('inf')] * nodes
    # 시작 노드의 최단 거리를 0으로 설정
    distance[start] = 0

    # 모든 간선을 확인하고 최단 거리를 갱신하는 과정을 반복
    for _ in range(nodes - 1):
        for u in range(nodes):
            for v, w in graph[u]:
                if distance[u] + w < distance[v]:
                    distance[v] = distance[u] + w

    # 음수 사이클이 존재하는지 확인
    for u in range(nodes):
        for v, w in graph[u]:
            if distance[u] + w < distance[v]:
                return "음수 사이클이 존재합니다."

    return distance

위의 코드에서 graph는 그래프를 나타내는 인접 리스트 형태의 입력입니다. 각 노드의 인접한 노드와 가중치가 포함되어 있습니다.

벨만-포드 알고리즘은 최악의 경우 O(NM)의 시간 복잡도를 가지게 됩니다. 따라서 그래프의 크기에 따라 실행 시간이 늘어날 수 있으므로, 대부분의 경우 다익스트라 알고리즘이 선호됩니다. 그러나 음수 가중치를 다룰 필요가 있는 상황에서는 벨만-포드 알고리즘이 유용하게 사용될 수 있습니다.