[알고리즘] 다익스트라
알고리즘 문제를 풀면서 다익스트라 알고리즘과 관련된 내용이 나왔다. 잘 모르는 부분이 있어서 기억하기 위해 정리하려 한다.
다익스트라 알고리즘
다익스트라 알고리즘은 그래프에서 출발점에서 도착점까지의 최단거리를 구할 때 사용하는 알고리즘이다.
주로 사용하는 변수 두개가 있다.
1 | int[] distance = new int[n+1]; |
distance
배열에는 각각의 노드까지의 최단 거리가 저장된다.
visit
배열에는 각각의 노드를 방문했는지 여부를 표시하여 저장한다.
다익스트라 알고리즘의 순서는 다음과 같다.
- 최단 거리를 저장하는 distance 배열에는 처음에 나올 수 있는 가장 큰 값으로 초기화 해준다. 보통 Integer.MAX_VALUE 값으로 초기화 한다.
- 시작 노드의 거리를 0으로 표시한다. (이는 당연하다. 자기 자신까지의 거리는 0이기 때문.) 그리고 시작 노드의 visit 값을 true로 바꿔준다.
- 시작노드와 연결되어 있는 노드들의 distance 값을 갱신한다.
- 방문하지 않은 노드 중 distance 값이 최소인 노드 min_node를 찾는다.
- min_node의 visit 값을 true로 변경한다. 그리고 min_node와 연결된 노드들(방문하지 않은)의 distance 값을 갱신한다. 이때, min_node와 연결된 distance 값이 distance[min_node] + min_node와 그 노드의 거리 보다 큰 경우 distance 값을 distance[min_node]+ min_node와 그 노드의 거리로 갱신해준다.
4 ~ 5번을 모든 노드를 방문할 때까지 반복
한다.
이렇게 순서를 설명했지만, 말로 설명하는 것보다는 그림을 보면서 이해하는 편이 더 빠를 것이다.
다음과 같은 그래프가 존재하고 시작점은 1이라고 가정한다. 그리고 간선에 표시되어 있는 값들은 가중치로 생각하면 된다.
- distance 값을 초기화 해준다.
node | 1 | 2 | 3 |
---|---|---|---|
distance | 무한대 | 무한대 | 무한대 |
visit | false | false | false |
- 시작 노드가 1이므로 시작 노드의 distance와 visit 값을 변경해준다.
node | 1 | 2 | 3 |
---|---|---|---|
distance | 0 | 무한대 | 무한대 |
visit | true | false | false |
- 시작 노드와 연결되어 있는 distance 값을 갱신한다.
node | 1 | 2 | 3 |
---|---|---|---|
distance | 0 | 2 | 4 |
visit | true | false | false |
-
방문하지 않은 노드 중 distance가 최소인 값을 찾는다. 노드 2가 될 것이다.
-
최소인 노드2의 visit 값을 true로 변경한다.
node | 1 | 2 | 3 |
---|---|---|---|
distance | 0 | 2 | 4 |
visit | true | true | false |
여기서는 노드 2와 연결되면서 방문하지 않은 노드들(여기서 노드 3)에 대해서 distance(3) > distance(2) + (2번과 3번 거리)
조건이 참이면 distance(3) = distance(2) + (2번과 3번 거리) 를 통해서 distance 값을 갱신한다.
3번까지의 거리는 4이고, 2번까지의 거리는 2 + 2와 3거리는 1이므로 4 > 2+1 이 성립된다. 따라서 distance(3)은 3으로 갱신된다.
node | 1 | 2 | 3 |
---|---|---|---|
distance | 0 | 2 | 3 |
visit | true | true | false |
이처럼 노드 3의 distance 값은 더 최소인 값으로 갱신된다.
다익스트라 알고리즘과 관련된 문제는 알고스팟이라는 문제이다.