다익스트라 알고리즘은 우선순위큐에 간선들을 넣고 빼는 과정으로 이루어져 있다. 따라서 각각에 해당하는 과정에 드는 시간복잡도를 더해주는 방식으로 구해볼 수 있다.
- PriorityQueue add 과정
- 최악의 경우 모든 간선들을 pq에 넣어야 하는 경우가 생기기 때문에
$ElogE$ 의 시간이 걸린다. -
$E < V^2$ 인 희소 그래프의 경우 다음과 같이 시간복잡도를 바꾸어서 쓸 수 있다.
- 따라서 우선순위큐에 간선을 넣는 시간은 (정확히 말하면 희소 그래프의 경우)
$O(ElogV)$ 라고 할 수 있다.
- PriorityQueue poll 과정
- PriorityQueue에서 한번 꺼내짐으로써 방문이 된 정점은 최솟값이 구해졌다고 보장할 수 있으므로 이후 PriorityQueue에 해당 정점이 들어가지 않는다.
- 따라서 우선순위큐에서 간선을 빼는 횟수는 정점의 갯수에 근사하게 된다.
- 그렇다면 시간 복잡도는
$O(VlogE)$ 라고 쓸 수 있다. - 희소그래프의 경우 1번 에서의 과정을 반복해
$O(VlogV)$ 라고 쓸 수 있다.
- 결론
- 앞서 구해진 add와 poll 과정의 시간복잡도를 더해볼 때 다익스트라 알고리즘의 시간 복잡도는
$O( (V+E)logV )$
라고 할 수 있다.
희소그래프는
다익스트라 알고리즘에서는 현재 갈 수 있는 정점 중 최소 비용을 가지는 정점을 찾아 방문을 하고 그 곳에서 갈 수 있는 정점들의 최소 비용을 갱신한다. 이 때 방문된 정점은 최소 비용이 구해졌다는 것을 보장하기 때문에 이후 다시 방문하지 않고 최솟값 또한 갱신되지 않는다. 하지만 음수인 간선이 있다면 방문이 되었어도 추후 음수간선으로 인해 더 적은 비용이 나올 수 있지만 방문되었기 때문에 갱신되지 못하므로 최적의 해를 구할 수 없다.
위와 같은 예시의 그래프에서 A 정점에서 출발할 경우 먼저 C가 방문되게 되고 비용의 최솟값은 4로 확정된다. 하지만 이후 B->C 간선으로 -90 비용이 나올 수 있음에도 불구하고 이미 방문된 C 정점의 최솟값은 갱신되지 않는다.
한 정점에서 다른 정점까지 가는데 최대 V-1 개의 간선을 거칠 수 있기 때문이다. V번 이상의 간선을 거쳐 방문한다면 중복된 간선을 거쳤다는 말이기 때문에 최소비용이라고 할 수 없다. 즉, 한 정점에서 다른 정점까지 가는 최소 비용을 구하기 위해 가능한 경로들을 모두 탐색하기 위해서는 V-1 번 까지 반복을 할 수 있어야 한다.
음수 간선 사이클이 없다면 한 정점이 자기 자신으로 오는 비용은 항상 0이 되어야만 한다. 하지만 음수 간선 사이클이 존재하면 자기 자신으로 돌아오는 dist[i][i]
값이 0보다 작은 음수값을 갖게 된다. 이를 통해 음수 간선 사이클의 유무를 판단할 수 있다.