O((V+E) log V)
O(V*E)
(1) -> (3)
으로 선택할 것이다.예를 들어, 각 간선을 아래와 같이 A, B, C라고 하자.
A가 10, B가 20, C가 -15이고, 시작점이 1인 경우에 다익스트라로 풀게 되면 A의 가중치 < B의 가중치
이므로 큐에 3번을 먼저 넣고, 그 다음으로 2번을 넣을 것이다.
3번 노드는 이미 visited = True가 되어, 2번 -> 3번
경로는 신경쓰지 않을 것이다.
다익스트라는 모든 가중치가 양수라고 가정하기 때문이다.
C의 가중치가 양수이면, A의 가중치 < B의 가중치
인 상황에서 A의 가중치 < B의 가중치 + C의 가중치
는 당연하기 때문에 이미 방문한 노드의 다른 경로는 보지 않는 것이다.
하지만 C의 가중치는 음수이기 때문에 잘못된 최단 거리를 찾게 된다.
(1) -> (2) -> (3)
으로 선택할 것이다.
- 모든 간선이 양수인 경우
- 음수 간선이 있는 경우
2-1. 음수 간선 순환은 없는 경우
2-2. 음수 간선 순환이 있는 경우
❗️ 음수 간선의 순환이 있는 경우를 주의해야 한다!
음수 간선의 순환(2 + 1 + (-4) = -1) 을 계속 돌게 되면, 최단 거리는 음의 무한이 되기 때문에
정점 수 -1(V-1)
만큼 다음 과정을 반복[참고]
벨만-포드 알고리즘 1
벨만-포드 알고리즘 2
https://stalker5217.github.io/algorithm/bellman-ford/
https://www.youtube.com/watch?v=Ppimbaxm8d8&ab_channel=%EB%8F%99%EB%B9%88%EB%82%98