Algorithm

[Algorithm] 벨만포드 알고리즘

SeanK 2022. 3. 25. 12:17

오늘은 딕스트라 알고리즘에 이은 벨만 포드!

 

음수의 값이 있을 때 최단거리를 구하는 데 사용할 수 있다. 

 

실제 상황에서 음수 거리라는 게 있을 수는 없지만... 저번 코딩 테스트 문제로 나와 당황했던 기억이 있으니 오늘 한번 풀어보려고 한다. 

 

방식은 아래와 같다. 

 

1. 노드 수만큼 최단거리를 표시하는 배열을 생성한다. 이 때 시작점을 제외하고는 INF 값을 넣는다. 시작점은 0을 넣어준다.

2. 노드 수 만큼 루프 하면서 모든 간선을 루핑 하는데 이때 최단거리에서 INF가 아닌 시작점이면서 도착점까지의 거리에 가중치를 더했을 때 현재의 거리보다 작아진다면 최단거리 배열을 수정한다. 

3. 마지막으로 위 과정을 한번 더 적용했을 때 만약 최단거리가 또 수정된다면 이는 무한 루프에 빠진 것으로 정답이 없는 게 답.

 

자바스크립트 코드 구현

function BellmanFord(num, edges, start) {
  let INF = Infinity;
  let dist = Array(num + 1).fill(INF);
  dist[start] = 0;

  for (let i = 0; i < num; i++) {
    edges.forEach((element, index) => {
      let [start, destination, value] = element;
      if (dist[start] !== INF && dist[start] + value < dist[destination]) {
        dist[destination] = dist[start] + value;
      }
    })
  }

  const isInfiniteLoop = edges.some((element, index) => {
    let [start, destination, value] = element;
    if (dist[start] !== INF && dist[start] + value < dist[destination]) {
      return true;
    }
  })
  
  return isInfiniteLoop ? [] : dist.slice(1, dist.length);
}