14938 서강그라운드

다익스트라는 한 노드에서 모든 노드에 대한 거리를, 플로이드 워셜은 모든 노드에서 모든 노드에 대한 거리를 찾는 알고리즘이다.

상당히 유사한 이 둘을 비교해보려 한다.


둘 다 사용 가능한 경우

특수한 예외가 없는 경우, “모든 노드에서 모든 노드에 대한 거리를 찾는” 방법의 경우는 두 가지이다.

  1. 모든 노드에 다익스트라 알고리즘을 적용 → 이 경우 N * 다익스트라라고 표현할 수 있다.
  2. 플로이드 워셜 알고리즘을 적용

이 때 다익스트라는 heapq를 쓸 경우 O(N * log N)이기 때문에,

다익스트라 : O(N^2 * log N) (모든 노드 N개에 대하여 다익스트라를 시행해야하기 때문에 N이 추가로 곱해짐.) 플로이드워셜: O(N^3)

으로 둘 다 가능한 경우에는 웬만해선 다익스트라가 플로이드 워셜보다 시간복잡도 면에서 유리하다.

다익스트라를 사용 불가능한 경우

항상 저런 상황만 있다면 당연히 다익스트라를 쓰면 되는데, 그래프에 “음수 사이클”이 있는 경우에는 다익스트라를 사용할 수 없다. ! 음수 간선이 있다고 다익스트라를 아예 못쓰는 것은 아니다. 음수 사이클의 존재 여부가 중요하다.

이 경우에 플로이드 워셜 또한 정답 보장할 수 없다는 것은 마찬가지지만, 플로이드 워셜은 음수 사이클의 존재 여부를 확인할 수 있다. 알고리즘 시행 결과 자기 자신에게 돌아오는 데 드는 가중치, 즉 배열의 대각선 값이 0보다 작은 경우가 있다면 음수 사이클이 존재하는 것.

그럼 음수 사이클을 확인할 수 있는 또 다른 알고리즘인 벨만-포드 알고리즘과도 비교해볼 수 있겠다. 벨만포드는 음수 사이클 판별이 가능한 다익스트라라고 보는 것이 더 옳아보이는데, 벨만포드 또한 기본적으로는 “단일 - 전체 대상”의 거리 판별 알고리즘이기 때문이다.

그래서 벨만포드도 모든 거리에 대해서 사용하려면 시간복잡도에 N이 곱해져야하는가 싶지만, 일반적으로 벨만포드를 루프 판별용으로 사용하는 경우, 시작 노드는 어느 것이 되든 상관 없기 때문에 N^2로 보는 것이 옳아보인다.

정리하자면,

적용대상 음수 사이클 판별 모든노드(N) 모든노드(V,E) 단일노드(N) 단일노드(V,E)
다익스트라 단일-전체 X N^2 * log N VE log V N log N E log V
벨만-포드 단일-전체 O N^3 V^2 * E N^2 VE
플로이드-워셜 전체-전체 O N^3 V^3 - -

이렇게 보면 플로이드-워셜이 굉장히 열등해보이는데, 저것만 쓸 수 있는 상황이 있을까?

만약 방향성 그래프에서 일방 통행에 의해 그래프 상에서 두 지역이 분리되는 경우에는, 벨만-포드에서 시작 노드를 잘못 고르면 음수 사이클의 존재도 판별할 수 없다. 음수 사이클이 존재하는 것도 특수한데, 이 경우는 더더욱 특수하다. ← 그런데 이런 경우가 가능할까? 나중에 한번 찾아보든가, 문제를 풀면서 마주해봐야겠다. 적절한 예시를 찾으면 그림으로 올리기.