Shortest Path - Dijkstra Algorithm
- 방향그래프(Directed Graph)의 간선이 양수의 Weight를 가질 때 임의의 출발 정점에서 도착 정점까지의 경로 중 경로의 길이가 최소인 경로를 최단경로라고 정의한다.
- 이러한 최단경로는 도로망, 항공로 지도, 작업공정계산 등에 널리 응용된다. 최단경로는 다익스트라의 알고리즘으로 구할 수 있다.
다익스트라의 알고리즘
- 인접행렬 상태로 각 간선의 가중치(Weight)가 존재하도록 한다.
정점 i에서 i까지의 가중치는 0이고 정점 i에서 j까지의 간선 E(i, j)가 존재치 않으면 가중치는 무한대(∞)가 된다. - 집합 S와 T를 정하는데 S는 출발 정점을 초기값으로 하고 집합 T는 출발 정점을 제외한 모든 정점을 포함하도록 초기화한다.
- 출발 정점을 제외한 모든 정점으로부터의 거리의 초기값(dist[i], 2<=i<=n)을 [1]의 인접행렬에서 취한다.
- 집합 T의 원소 중 출발점으로부터의 거리가 최소인 정점 v를 택하여 T에서 제거하고 집합 S에 추가한다.
- T집합내의 모든 정점 w에 대해 출발점으로부터의 거리(dist[w])와 간선 E(v, w)의 길이에 v정점의 거리(dist[v])를 합한 값 중 작은 것을 선택하여 정점 w의 거리(disw[w])로 한다.
- [4]와 [5]의 과정을 T집합이 공집합이 될 때까지 반복한다.
shortest(int adj_matrix[n][n]) {
T={2, 3, ..., n};
S={1};for(i=2; i<=n; i++)
dist[i]=adj_matrix[1][i]; //초기 경로 길이
for(i=2; i<=n; i++) {
v=T내의 정점 중 dist[i]가 최소인 정점;
T에서 v를 삭제;
S에서 v를 삽입;
while(T내의 모든 정점 w에 대해)
dist[w]=MIN(dist[w], dist[v]+adj_matrix[v][w])
}
return(dist
}
adj+matrix[ ][ ]는 각 간선의 인접행렬:
초기 상태
S = {0}
T = {1, 2, 3, 4, 5, 6}
- 위의 초기상태는 정점 0에서 다른 모든 정점까지의 거리를 보여준다.
- 초기상태에서 dist[]값 중에서 가장 작은 값을 가진 정점 4를 선택하여 집합 S에 삽입하고 집합 T에서 삭제한다.
- 정점 0에서 모든 정점까지의 거리와 정점 0에서 정점 4를 거쳐서 모든 정점까지 가는 거리를 비교하여 작은 값을 선택한다.
- 아래의 그림에서 정점 2까지의 거리가 9에서 7로 변화된 것을 볼 수 있다. 이와 같이, 집합 T에 있는 모든 정점에 대해 동일한 과정을 반복하고 그 결과를 반영한다.
S = {0, 4}
T = {1, 2, 3, 5, 6}dist[1]:
11 < dist[4] + adj_matrix[4][1] = 3+∞ = ∞dist[2]:
9 > dist[4] + adj_matrix[4][2] = 3+4 = 7dist[3]:
∞ > dist[4] + adj_matrix[4][3] = 3 + 16 = 19dist[5]:
∞ > dist[4] + adj_matrix[4][5] = 3 + 21 = 24dist[6]:
∞ > dist[4] + adj_matrix[4][6] = 3 + 40 = 43
S = {0, 2, 4}
T = {1, 3, 5, 6}dist[1]:
11 < dist[2] + adj_matrix[2][1] = 7 + ∞ = ∞dist[3]:
19 < dist[2] + adj_matrix[2][3] = 7 + ∞ = ∞dist[5]:
24 > dist[2] + adj_matrix[2][5] = 7 + 12 = 19dist[6]:
43 < dist[2] + adj_matrix[2][6] = 7 + ∞ = ∞
S = {0, 1, 2, 4}
T = {3, 5, 6}dist[3]:
19 < dist[1] + adj_matrix[1][3] = 11 + ∞ = ∞dist[5]:
19 < dist[1] + adj_matrix[1][5] = 11 + ∞ = ∞dist[6]:
43 > dist[1] + adj_matrix[1][6] = 11 + 30 = 41
S = {0, 1, 2, 3, 4}
T = {5, 6}dist[5]:
19 < dist[3] + adj_matrix[3][5] = 19 + ∞ = ∞dist[6]:
41 > dist[3] + adj_matrix[3][6] = 19 + 21 = 40
S = {0, 1, 2, 3, 4, 5}
T = {6}dist[6]:
40 > dist[3] + adj_matrix[5][6] = 19 + 18 = 37
- 최종적으로 집합 T에 모든 정점이 제거되었을 때 dist[]에 남아있는 값들이 정점 0에서 다른 모든 정점까지의 최단거리를 나타내는 값이 된다. 최종적인 최단경로는 위에서 보는 바와 같다.
예)
시작정점 0에서 3까지는 19
시작정점 0에서 6까지는 37
'프로그래머의 길 > 알고리즘' 카테고리의 다른 글
Dijkstra Algorithm (0) | 2009.02.02 |
---|---|
qsort 함수에 대하여.. (0) | 2007.04.03 |
이진탐색 (Binary Search) 알고리즘 (0) | 2007.04.03 |
퀵 정렬(Quick Sort) (0) | 2007.04.03 |
쉘 정렬(Shell sort) (0) | 2007.04.03 |