목표: Edge에 Weight가 존재하는 Graph에서 Path Weight가 가장 작은 Path를 찾자
4가지의 경우의 수가 존재한다.
Single-source & all destinations 만을 이용하여 나머지 3가지 경우 모두 해결이 가능하다.
Prove) Single-source & all destinations의 Running time = T(n)이라고 가정하자.
Single-source & single-destination은 Single-source & all destinations의 부분집합이므로 해결 가능하다.
all sources & single-destination은 원래의 그래프 를 시켜 Single-source & all destinations을 수행한 것과 동일하다.
all pairs은 모든 vertex가 source인 경우로 n번 Single-source & all destinations을 수행하면 된다.
Edge Weight가 음수인 경우
문제가 되는 경우: Source vertex로 부터 reachable한 negative cycle이 존재하는 경우
Shortest path problem에서는 cycle을 무시한다.
Shortest path algorithm에서 사용된 edge와 vertex로만 이루어진 Subgraph

Worst case
각 vertex가 해당 vertex까지의 path에 있는 모든 vertex를 저장하는 경우

Best case
각 vertex가 해당 vertex의 predecessor만 저장하는 경우

Destination vertex에 저장되어있는 숫자가 (Source vertex에 저장되어있는 숫자 + Edge Weight) 보다 크면 UPDATE한다.
Nonnegative edge weight인 경우에 한해서 정상적으로 동작한다.
초기 세팅

과정

선택한 vertex에 대해 해당 vertex로부터 인접한 vertex를 relaxing 한다.
(1)의 과정이 종료되고, S 집합에 (1)에서 사용한 vertex를 추가한다.
집합 S에 존재하지 않는 vertex 중 distance가 가장 작은 vertex에 대해 (1) ~ (2) 의 과정을 반복한다.
집합 S에 모든 vertex가 추가되면 알고리즘을 종료한다.
Running time
하나의 vertex 마다 집합 S에 존재하지 않는 vertex 모두를 탐색한다.
Running time을 줄일 수 있다.
초기 세팅

과정

EXTRACT-MIN의 결과로 나온 vertex에 대해 해당 vertex로부터 인접한 vertex를 relaxing 한다.
(1)의 과정에서 Relaxing의 결과로 Update 되었다면 HEAP-DECREASE-KEY 진행한다.
Min-heap에 존재하는 vertex가 없을 때까지 (1) ~ (2) 의 과정을 반복한다.
Pseudo code
DIJKSTRA(G, w, s)
1. INITIALIZE-SINGLE-SOURCE(G, s)
2. S = ∅
3. Q = G.V //priority queue
4. while Q != ∅
5. u = EXTRACT-MIN(Q)
6. S = S ∪ {u}
7. for each vertex v ∈ G.Adj[u]
8. RELAX(u, v, w) //DECREASE-KEY(V, d[V])를 수행
Running time
: Unsorted array를 사용할 때
: Min-heap을 사용할 때
Prim's algorithm과 다르게 VlogV를 무시하지 않는 이유는 Minimum spanning tree를 결정할 때에 비해 방문하는 vertex의 개수가 많기 때문이다.
인 경우에는 오히려 Unsorted array를 사용하는 것이 유리하다.
: Fibonacci heap를 사용할 때
Negative-weight edge가 존재할 때도 single source shortest paths problem을 해결할 수 있는 알고리즘
초기 세팅

과정

번 반복하며 각 단계마다 Graph에 존재하는 모든 edge를 Relaxing 한다.

(1)의 과정이 종료되었을 때, 각 vertex에 저장되어있는 것이 shoretest distance이다.
Pseudo code of Bellman-Ford algorithm
BELLMAN-FORD(G, w, s) //w: weight, s: source
1. INITIALIZE-SINGLE-SOURCE(G, s)
2. for i = 1 to |G.V|-1 //source vertex 제외
3. for each edge (u, v) ∈ G.E
4. RELAX(u, v, w)
5. for each edge (u, v) ∈ G.E
6. if v.d > u.d + w(u,v)
7. return FALSE
8. return TRUE
Line 5 ~ 8: BELLMAN-FORD 알고리즘이 제대로 작동할 수 있는지를 판단하는 부분이다.
Running time

Dijkstra's Algorithm 보다 Running time은 크지만, Negative-weight edge가 존재하는 경우까지 계산할 수 있다는 이점이 존재한다.
DAG에서 사용가능한 Single-source shortest paths 알고리즘
초기 세팅

과정
Pseudo code
DAG-SHORTEST=PATHS(G, w, s)
1. topologically sort the vertices of G
2. INITIALIZE-SINGLE-SOURCE(G, s)
3. for each vertex u, taken in topologically sorted order
4. for each vertex v ∈ G.Adj[u]
5. RELAX(u, v, w)
Running time