cs/알고리즘

플로이드 워셜(Floyd-Warshall)

ssoonn 2024. 7. 15. 21:47

플로이드 워셜 알고리즘이란?

모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구하는 알고리즘

한 번 실행하여 모든 노드 간 최단 경로를 구할 수 있다.

 

핵심 아이디어는 '거쳐가는 정점'을 기준으로 최단 거리를 구하는 것

 

다익스트라 알고리즘과의 차이점

  • 모든 노드 쌍에 대한 최단 거리 계산
  • 음의 가중치를 가지는 그래프에서 사용 가능
    <--> 다익스트라의 경우 양의 가중치를 가지는 그래프에서만 사용
  • 소스코드가 다익스트라에 비해 매우 짧아 구현이 쉬움
  • 단계마다 '거쳐 가는 노드'를 기준으로 알고리즘을 수행하지만, 매 단계마다 방문하지 않은 노드 중에서 최단 거리를 갖는 노드를 찾을 필요는 없음
    <--> 다익스트라의 경우 단계마다 최단 거리를 가지는 노드를 하나씩 반복적으로 선택. 이후 해당 노드를 거쳐가는 경로를 확인하며 최단 거리 테이블을 갱신하는 방식으로 동작한다.
  • 2차원 테이블에 최단 거리 정보 저장 (모든 지점에서 다른 모든 지점까지의 최단 거리 저장)
    <--> 다익스트라는 1차원 리스트에 저장(한 지점에서 다른 지점까지의 최단 거리)
  • 다이나믹 프로그래밍 기술에 의거 ( 노드의 개수가 N개라고 할 때, N번 만큼의 단계를 반복하며 *점화식에 맞게 2차원 리스트를 갱신)
    <--> 다익스트라는 그리디 알고리즘

 

핵심 이론과 점화식

a노드에서 b노드까지 최단 경로를 구했다고 가정했을 때, 최단 경로 위에 k노드가 존재한다면, 그것을 이루는 부분 경로 역시 최단 경로.

 

파란색 에지 경로가 1->5의 최단 경로라면, 1->4와 4->5의 최단 경로 역시 파란색 에지로 이뤄질 수밖에 없다.

즉, 전체 경로의 최단 경로는 부분 경로의 최단 경로의 조합으로 이뤄진다.

 

플로이드 워셜 알고리즘의 점화식

 

 

플로이드 워셜 알고리즘 수행 과정

 

1. 배열을 선언하고 초기화하기

D[S][E]는 노드 S에서 노드 E까지의 최단 거리를 저장하는 배열이라 정의.

S와 E의 값이 같은 칸은 0으로, 다른 칸은 ∞으로 초기화한다.

 

2. 최단 거리 배열에 그래프 데이터 저장하기

출발 노드는 S, 도착 노드는 E, 에지의 가중치는 W라고 했을 때 D[S][E] = W로 에지의 정보를 배열에 저장한다.

3. 점화식으로 배열 업데이트하기

기존에 구했던 점화식을 3중 for문의 형태로 반복하면서 배열의 값을 업데이트한다.

유의점은, for문에서 가운데 노드인 m이 제일 위에 있어야 한다는 것!

for 경유지 K에 관해 (1 ~ N)
	for 출발 노드 S에 관해 (1 ~ N)
    	for 도착 노드 E에 관해 (1 ~ N)
        	D[S][E] = Math.min(D[S][E], D[S][K] + D[K][E])

완성된 배열은 모든 노드 간의 최단 거리를 알려 준다.

 

 

 

시간 복잡도 O(N^3)

노드의 개수가 N개 일 때, N번의 단계를 수행하며, 단계마다 O(N^2)의 연산을 통해 '현재 노드를 거쳐 가는 모든 경로'를 고려한다. 따라서 시간 복잡도는 총 O(N^3)이다.

 

 

연습문제

백준 11404 플로이드

 

 

 

 

ref

https://velog.io/@kimdukbae/플로이드-워셜-알고리즘-Floyd-Warshall-Algorithm

 

[알고리즘] 플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm)

지난 포스팅에서는 다익스트라 알고리즘에 대해 작성했었다. 다익스트라의 경우 한 지점에서 다른 특정 지점까지의 최단 경로를 구하는 알고리즘이다. 그러나 모든 지점에서 다른 모든 지점까

velog.io

https://blog.naver.com/ndb796/221234427842

 

24. 플로이드 와샬(Floyd Warshall) 알고리즘

  지난 시간에는 다익스트라(Dijkstra) 알고리즘에 대해 학습했습니다. 다익스트라 알고리즘은 하나...

blog.naver.com

https://chanhuiseok.github.io/posts/algo-50/

 

알고리즘 - 플로이드-워셜(Floyd-Warshall) 알고리즘

컴퓨터/IT/알고리즘 정리 블로그

chanhuiseok.github.io

https://namu.wiki/w/%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%8C%EC%85%9C%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

플로이드-워셜 알고리즘

플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm)은 그래프 에서 가능한 모든 노드 쌍에 대해

namu.wiki

https://velog.io/@e414/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B7%B8%EB%9E%98%ED%94%84-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%8C%EC%85%9C

 

알고리즘 [그래프] - 플로이드 워셜

플로이드-워셜(floyd-warshall) 알고리즘은 그래프에서 최단 거리를 구하는 알고리즘으로, 주요 특징은 다음과 같다.플로이드-워셜 알고리즘을 도출하는 가장 핵심적인 원리는 A노드에서 B노드까지

velog.io