Algorithm
[고급 알고리즘] Graph(Shortest Path): Floyd-Warshall
noahkim_
2024. 9. 20. 14:16
1. Floyd-Warshall
- 모든 정점 쌍 간의 최단 경로를 찾는 알고리즘 입니다.
- ✅ 음수 가중치가 허용됨
- ❌ 음의 사이클에는 사용 불가
2. 동작 원리
- 모든 정점을 경유지로 설정
- ✅ 최단 경로가 경유지를 거쳐 더 짧아질 수 있는지 확인
- ➡️ 각 정점 쌍 간의 최단 거리를 반복적으로 갱신합니다. (Dynamic Programming)
초기화
- 모든 정점 쌍에 대해, 직접 연결된 경로의 거리 초기화
- ✅ 자기 자신으로 가는 경로 = 0
- ✅ 연결되지 않은 경로 = infinit
경유지 검사
- i->j 로 가는 최단 경로가 경유지를 통해 더 짧아질 수 있는지 검사
- ✅ 정점 k를 경유지로 설정
3. 구현
더보기
int[][] dist = new int[n][n];
for (int i = 0; i < n; i++) {
Arrays.fill(dist[i], INF);
dist[i][i] = 0;
}
for (int[] edge : edges) {
int s = edge[0], d = edge[1], w = edge[2];
dist[s][d] = w;
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
if (dist[i][k] == INF) continue;
for (int j = 0; j < n; j++) {
if (dist[k][j] == INF) continue;
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
Time Complexity: O(V^3)
출처