두 노드를 잇는 가장 짧은 경로를 찾거나, 가중치가 있는 그래프(Weighted Graph)에서 간선의 가중치의 합이 최소가 되도록 하는 경로를 찾으려는 것이 목적
V개의 정점과 음수가 아닌 E개의 간선을 가진 그래프 G에서 특정 출발 정점(S)에서부터 다른 모든 정점까지의 최단경로를 구하는 알고리즘.
BFS 기반
1. 시작노드를 제외한 모든 노드의 거리정보를 무한대로 초기화한다.
2. 아직 방문하지 않은 정점들 중 거리가 가장 짧은 정점을 하나 선택해 방문한다.
3. 해당 정점에서 인접하고 아직 방문하지 않은 정점들의 거리를 갱신한다.
O(ElogV)
// 개선된 다익스트라 알고리즘 추가(최소 힙, 우선순위 큐)
시작노드 s에서 v에 이르는 최단경로를 s에서 u까지의 최단경로에 u에서 v 사이의 가중치(거리)를 더한 값으로 분해(decomposition)한다. 그래프에서 시작 정점에서 특정 정점까지 도달하기 위해 거쳐가는 최대 간선 수는 V−1개 이기 때문에 edge relaxation을 V-1번 수행한다.
- 시작 정점을 결정한다.
- 시작 정점부터 다른 정점까지 거리 값 모두 무한대로 초기화한다. (시작 정점은 0으로 초기화)
- 현재 정점의 모든 인접 정점들을 탐색하며, 기존에 기록된 인접 정점까지의 거리보다 현재 정점을 거쳐 인접 정점에 도달하는 거리가 더 짧다면 인접 정점까지의 거리를 갱신한다.
3번 과정을 V−1번 반복한다.
위 과정을 모두 마친 후에도 거리가 갱신되는 경우가 있다면 그래프에 음수 사이클이 존재한다는 것을 알 수 있다.
O(EV)
V개의 정점과 E개의 간선을 가진 가중 그래프 G에서 모든 정점 사이의 최단경로를 구하는 알고리즘. 어떤 두 정점 사이의 최단 경로는 어떤 경유지 K를 거치거나 거치지 않는 두 가지이기에 A-B이거나 A-K-B이다. 만약 경유지 K를 거친다면, 최단 경로를 이루는 부분 경로 A-K와 K-B도 각각 최단 경로이다.
O(V^3)