본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 11404 플로이드

by 까망 하르방 2021. 2. 25.
반응형

출처: https://www.acmicpc.net/problem/11404

 Input 

5

14

1 2 2

1 3 3

1 4 1

1 5 10

2 4 2

3 4 1

3 5 1

4 5 3

3 5 10

3 1 8

1 4 2

5 1 7

3 4 2

5 2 4

 

 Output 

0  2 3  1 4

12 0 15 2 5

8  5 0  1 1

10 7 13 0 3

7  4 10 6 0

플로이드 와샬 (Floyd Warshall)을 통해 구현할 수 있습니다.

 

플로이드 와샬 (Floyd Warshall)

개념 아래와 같은 가중 그래프에서 최단 경로를 찾는 알고리즘. ex) 정점 ③ → ⑤로 가는 최단 경로는 다음과 같습니다.    경로Path: ③ → ② → ④ → ① → ⑤ 비용Cost:  +4 +1 +2  -4 = 3..

zoosso.tistory.com

『   『 』로 가는 경우에는 cost = 0

 

『   『 j 』 가는 최단거리 비용을 찾기 위해 정점 『 k 』를 추가하며 최단거리 비용을 갱신해줍니다.

 

정답을 출력할 때는 실제 연결되어 있지 않은 부분 『 INF   『 0 』으로 변환하여 출력합니다.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
    public static final int INF = 1000000;
    public static int N, M;
    public static int[][] dist;
     
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
         
        N = Integer.parseInt(br.readLine());
        dist = new int[N + 1][N + 1];
        for(int i=1; i<=N; i++) {
            for(int j=1; j<=N; j++) {
                if(i == j) continue;
                dist[i][j] = INF;
            }
        }
         
        M = Integer.parseInt(br.readLine());
        while (M-- > 0) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int cost = Integer.parseInt(st.nextToken());
            dist[u][v] = Math.min(dist[u][v], cost);
        }
         
        // 플로이드 와샬 알고리즘
        floydWarshall();
         
        // 정답출력
        printAnswer();
    }
     
    public static void floydWarshall() {
        // 중간에 거쳐가는 정점 (k)
        for(int k = 1; k <= N; k++) {
            // 출발 정점 (i)
            for(int i=1; i <= N; i++) {
                // 도착 정점 (j)
                for(int j=1; j <= N; j++) {
                    // 기존에 저장된 최단 거리와 정점 k를 거쳐가는 (i → k) + (k → j) 경로 중 최소값
                    dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
                }
            }
        }
    }
     
    public static void printAnswer() {
        StringBuilder sb = new StringBuilder();
        for(int i=1; i <= N; i++) {
            for(int j=1; j <= N; j++) {
                if(dist[i][j] >= INF) sb.append("0 ");
                else sb.append(dist[i][j] + " ");
            }
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 7785 회사에 있는 사람  (0) 2021.02.25
[BOJ] 백준 11780 플로이드 2  (0) 2021.02.25
[BOJ] 백준 12791 Starman  (0) 2021.02.25
[BOJ] 백준 11652 카드  (0) 2021.02.25
[BOJ] 백준 2884 알람 시계  (0) 2021.02.24

댓글