Java/Do it 알고리즘 코딩테스트 핵심이론 강의
알고리즘 코딩테스트 핵심이론 강의 - 플로이드-워셜
냠냠쿠
2023. 8. 9. 13:18
728x90
https://www.youtube.com/watch?v=ibYzw9XAzyc&list=PLFgS-xIWwNVX-zm4m6suWC9d7Ua9z7fuT&index=33
📌 플로이드 - 워셜
- 그래프에서 최단 거리를 구하는 알고리즘
- N의 크기가 크면 프로이드-워셜을 사용하지 않는것이 좋다. (시간 복잡도)
노드 100개 ~ 200개 사이가 적당
기능특징시간 복잡도(노드수 : V , 에지 수 : E)
모든 노드 간 최단 경로 탐색 | - 음수 가중치 에지가 있어도 수행 가능 - 동적 계획법 원리를 이용해 알고리즘에 접근 |
O(V³) |
◾ 플로이드 - 워셜 원리
- A노드에서 B노드까지 최단 경로를 구했다고 가정했을 때, 최단 경로 위에 K노드가 존재한다면 그것을 이루는 부분 경로 역시 최단 경로
→ 색칠 된 경로가 1에서 5까지 최단 경로라면 1 → 4 최단 경로와 4 → 5 최단 경로 역시 색칠 된 에지로 이루어 질 수밖에 없다.
🔶 도출한 플로이드-워셜 점화식
D[S][E] = Math.min( D[S][E], D[S][K] + D[K][E] )
1. 리스트를 선언하고 초기화 하기
- D[S][E]는 노드 S에서 노드 E까지의 최단거리를 저장하는 리스트라 정의
S와 E의 값이 같은 칸은 0 , 다른 칸은 ∞로 초기화
여기서 S==E는 자기 자신에게 가는데 걸리는 최단 경로값을 의미
내 자신에게 가는 시간은 0이기 때문에
2. 최단 거리 리스트에 그래프 데이터 저장하기
- 출발 노드는 S, 도착 노드는 E, 에지의 가중치는 W라고 했을 때 D[S][E] = W로 에지의 정보를 리스트에 입력
이로써 플로이드-워셜 알고리즘은 그래프를 인접 행렬로 표현한다는 것을 알 수 있음
3. 점화식으로 리스트 업데이트 하기
- 기존에 구했던 점화식을 3중 for문 형태로 반복하면서 리스트 값을 업데이트
🔶 플로이드-워셜 알고리즘 로직
- 가장 바깥쪽이 K, S, E 순서이다.
for ( int K=0; K<N; K++) {
for ( int S=0; S<N; S++){
for ( int E=0; E<N; E++){
D[S][E] = Math.min(D[S][E], D[S][K] + D[K][E])
// 기존 값 (D[S][E]) 보다 특정 수 (K)를 거쳐서 가는 수 (D[S][K] + D[K][E])가 작으면
// 기존 값을 작은 수(D[S][K] + D[K][E])로 업데이트
}
}
}
- 완성된 리스트는 모든 노드간의 최단거리를 알려준다.
예를들어 1번 노드에서 5번 노드까지 가는 최단 거리는 D[1][5] = 6으로 나타나는 것을 알 수 있음 - 모든 노드 간의 최단 거리를 확인 해 주기 때문에 시간 복잡도가 빠르지 않은 편
- 노드 개수의 범위가 다른 그래프에 비해 적게 나타남
728x90