[알고리즘 이론] 벨만-포드 알고리즘

2025. 4. 30. 01:59·알고리즘

그래프 최단 경로 알고리즘은 크게

  1. 플로이드워셜
  2. 다익스트라
  3. 벨만-포드

가 있다. 여기서 벨만-포드 알고리즘에 대해서 알아보고자 한다.

 

기능과 특징

벨만-포드 알고리즘은

  • 다익스트라 알고리즘처럼 하나의 출발 노드에서 다른 모든 노드까지의 최단 경로를 구하는 알고리즘이다.
  • 하지만 다익스트라 알고리즘과 가장 큰 차이는, 가중치가 음수인 간선이 있어도 최단 경로를 구할 수 있다는 점이다.
  • 또한 음수 사이클이 존재하는지도 탐지할 수 있다는 특징이 있다.
  • 시간 복잡도는 O(VE)이다. (V : 노드의 수,  E : 엣지의 수)

 

동작 원리

1. 엣지 리스트로 그래프를 구현하고 최단 경로 리스트 초기화하기

초기화 단계로, 벨만-포드 알고리즘은 엣지 중심으로 동작하기 때문에 그래프를 엣지 리스트로 구현한다. 또한 최단 경로 리스트는 출발 노드는 0, 나머지 노드는 무한대로 초기화한다.

2. 모든 엣지를 확인해 최단 거리 리스트 업데이트하기

최단 거리 리스트에서 업데이트를 반복하는 최대 횟수는 노드 개수 N에서 1을 뺀 N−1번이다. 이는 음수 사이클이 없는 경우, 어떤 노드로 가는 최단 경로를 구성하는 간선(Edge)의 최대 개수가 N−1개이기 때문이다. 노드가 N개 있을 때, 최단 경로를 구성하는 간선이 N−1개를 초과하면 경로상에 사이클이 생기게 되는데, 최단 경로는 사이클을 포함할 수 없으므로 간선 개수는 최대 N−1개를 넘을 수 없다.

 

모든 Edge E=(s, e, w)에서 다음 조건을 만족하면 업데이트를 실행한다.

dist[s] != ∞ 이며 dist[e] > dist[s] + w일 때, dist[e] = dist[s] + w 로 업데이트

 

업데이트 반복 횟수가 K번이라면 해당 시점에 정답 리스트의 값은 시작점에서 K개의 엣지를 사용했을 때 각 노드에 대한 최단 거리이다. 음수 사이클이 없을 때 N-1번 Edge 사용 횟수를 반복하면 출발 노드와 모든 노드 간의 최단 거리를 알려 주는 정답 리스트가 완성된다.

3. 음수 사이클 유무 

최단 거리를 구한 뒤, 그래프에 음수 사이클이 존재하는지 확인하기 위해 모든 간선을 한 번 더 검사해야 한다. 이를 위해 N−1번의 반복 이후 모든 간선을 다시 순회하여, 추가로 최단 거리 업데이트가 발생하는지 확인한다. 만약 업데이트가 발생한다면, 이는 음수 사이클이 존재한다는 의미이며, 이 경우 2단계에서 도출한 최단 거리 결과는 의미가 없어진다. 음수 사이클이 존재하면 사이클을 계속 순회하면서 최단 거리가 무한히 갱신되기 때문이다.

저작자표시 비영리 변경금지

'알고리즘' 카테고리의 다른 글

[Boj2240] 자두나무  (1) 2024.11.20
[Boj16926] 배열 돌리기 1  (0) 2024.11.17
[BOJ1068] 트리  (1) 2024.11.16
[코드트리 조별과제] 부분 수열의 합이 K (누적합)  (1) 2024.08.20
[코드트리 조별과제] 두 수의 합 (HashMap)  (0) 2024.08.18
'알고리즘' 카테고리의 다른 글
  • [Boj2240] 자두나무
  • [Boj16926] 배열 돌리기 1
  • [BOJ1068] 트리
  • [코드트리 조별과제] 부분 수열의 합이 K (누적합)
l'avenirJun
l'avenirJun
  • l'avenirJun
    오늘도 꾸준히 개발
    l'avenirJun
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 📚 개발자의 서재 N
        • 객체지향의 사실과 오해
        • Good Code, Bad Code
        • 도메인 주도 개발 시작하기 N
      • 🔧 트러블 슈팅
      • Java
      • Spring
      • 운영체제
        • 공룡책 학습
      • 알고리즘
      • GIT
      • 면접 지식
      • Spring 단기심화 2기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코드트리
    가독성
    역할
    타입
    책임-주도 설계
    DIP
    애그리거트
    인터페이스
    코딩트리조별과제
    캡슐화
    협력
    객체지향의 사실과 오해
    specification
    유스케이스
    코딩테스트
    good code bad code
    매핑 구현
    리포지터리
    책임
    메시지
    모듈화
    도메인 모델
    오블완
    일반화
    객체
    추상화
    애그리거트 루트
    코드 계약
    도메인 주도 개발 시작하기
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
l'avenirJun
[알고리즘 이론] 벨만-포드 알고리즘
상단으로

티스토리툴바