벨만 보드 알고리즘은 다익스트라 알고리즘과 같이 한 정점으로부터 다른 모든 정점으로 최단경로를 찾는 알고리즘입니다. 차이점은 음수 간선이 포함된 상황에서 최단 거리를 계산할 때 사용합니다.
A => C로 갈때 두 가지 경로가 존재합니다.
(1) 출발 노드를 선정합니다.
(2) 최단 거리 테이블을 초기화합니다.
(3) 다음의 과정을 N-1번 반복합니다.
- 1. 전체 간선 E개를 하나씩 확인합니다.
- 2. 각 간선을 거쳐서 다른 노드로 가는 비용을 계산하여 최단 거리 테이블을 갱신합니다.
(4) N번째 조회: 만약 음수 간선 순환이 발생하는지 체크하고 싶다면 3번의 과정을 한번 더 수행합니다.
2,3,4 번 노드가 연결되어있어 갱신되었습니다.
위의 과정을 시작점을 바꿔서 반복합니다.
function BellmanFord(num, edges, start) {
const INF = Number.MAX_SAFE_INTEGER;
const dist = Array(num+1).fill(INF);
dist[start] = 0;
for (let v = 1; v <= num -1; v++) {
edges.forEach(el => {
const [src, dst, weight] = el;
if (dist[src] !== INF && dist[src] + weight < dist[dst]) {
return true;
}
})
}
const hasNegative = edges.some(el => {
const [src, dst, weight] = e;
if (dist[src] !== INF && dist[src] + weight < dist[dst]) {
return true
}
})
return hasNegative ? [] : dist.slice(1)
}
https://developer-davii.tistory.com/89
https://chs96.github.io/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/%EB%B2%A8%EB%A7%8C%ED%8F%AC%EB%93%9C/