본문 바로가기
코딩 테스트 수련의방/알고리즘

플로이드 워셜 알고리즘

by L3m0n S0ju 2023. 6. 2.

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

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

  • 모든 최단 경로를 구하는 알고리즘

다익스트라는 하나의 정점에서 다른 모든 정점까지의 최단 거리를 구하는 알고리즘(S.S.S.P - Single Source Shortest Path) 이었다면, 플로이드-워셜 알고리즘은 한 번 실행하여 모든 노드 간 최단 경로를 구할 수 있습니다.

  • 플로이드-워셜 알고리즘은 다익스트라 알고리즘과는 다르게 음의 간선도 사용할 수 있다.

 

시간 복잡도 : O(n^3)

 

 

 

 

 

 

예제


프로그래머스 - 합승 택시 요금

 

 

 

import java.util.*;

class Solution {
    static final int INF = 987654321;

    public int solution(int n, int s, int a, int b, int[][] fares) {
        int answer = INF;
        int dist[][] = new int[n+1][n+1];
        for(int i=0; i<n+1; i++){
            Arrays.fill(dist[i], INF);
        }

        for(int i=0; i<fares.length; i++){
            int c = fares[i][0];
            int d = fares[i][1];
            int f = fares[i][2];
            dist[c][d] = f;
            dist[d][c] = f;
            
        }
        
        for(int k=1; k<n+1; k++){
            for(int i=1; i<n+1; i++){
                for(int j=1; j<n+1; j++){
                    if(i==j) dist[i][j] = 0;
                    dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
                }
            }
        }
        
        for(int i=1; i<n+1; i++){
            if(dist[s][i] != INF && dist[i][a] != INF && dist[i][b] != INF){
                answer = Math.min(answer, dist[s][i] + dist[i][a] + dist[i][b]);
            }
        }
        
        return answer;
    }
}

 

 


프로그래머스 - 배달

 

class Solution { 
    public int solution(int N, int[][] road, int K) {
        int[][] arr = new int[N][N];        
        int answer = 0;

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(i == j) {
                    continue;
                }                
                arr[i][j] = 500001;
            }
        }
    
        for (int i = 0; i < road.length; i++) {
            if(arr[road[i][0]-1][road[i][1]-1] > road[i][2]) {
                arr[road[i][0]-1][road[i][1]-1] = road[i][2];
                arr[road[i][1]-1][road[i][0]-1] = road[i][2];
            }
        }
        
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < N; k++) {
                    if(arr[j][k] > arr[j][i] + arr[i][k]) {
                        arr[j][k] = arr[j][i] + arr[i][k];
                    }
                }
            }
        }
        
        for (int i = 0; i < N; i++) {
            if(arr[0][i] <= K) {
                answer++;
            }
        }   
        
        return answer;
    }
}

 

 

'코딩 테스트 수련의방 > 알고리즘' 카테고리의 다른 글

다익스트라 알고리즘  (0) 2023.06.18
투 포인터 알고리즘  (0) 2023.06.17
DP 알고리즘  (0) 2023.06.12
DFS 알고리즘  (0) 2023.06.09
BFS 알고리즘  (0) 2023.06.02

댓글