[BOJ]11404 - 플로이드(G4)

suhyun·2023년 1월 20일
0

백준/프로그래머스

목록 보기
62/81

문제 링크

11404-플로이드


입력

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다.
그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다.

먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 버스의 정보는 버스의 시작 도시 a, 도착 도시 b, 한 번 타는데 필요한 비용 c로 이루어져 있다.
시작 도시와 도착 도시가 같은 경우는 없다.
비용은 100,000보다 작거나 같은 자연수이다.

시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다.

출력

n개의 줄을 출력해야 한다.
i번째 줄에 출력하는 j번째 숫자는 도시 i에서 j로 가는데 필요한 최소 비용이다.
만약, i에서 j로 갈 수 없는 경우에는 그 자리에 0을 출력한다.


문제 풀이

한점에서 다른점으로 가는 최단경로를 구하는 문제여서
당연히 플로이드-와샬 알고리즘을 생각했다.

문제의 입력과 출력부분에서 위의 굵게 표시한 부분만 주의하면
간단하게 풀리는 문제!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static final int INF = 10000001;
    static int n, m;
    static int[][] maps;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        n = Integer.parseInt(br.readLine());
        m = Integer.parseInt(br.readLine());
        maps = new int[n][n];

        for (int i = 0; i < n; i++) {
            Arrays.fill(maps[i], INF);
            maps[i][i] = 0;
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken());
            int to = Integer.parseInt(st.nextToken());
            int price = Integer.parseInt(st.nextToken());

            maps[from - 1][to - 1] = Math.min(maps[from - 1][to - 1], price);
        }

        floyd();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(maps[i][j] == INF) maps[i][j] = 0;
                System.out.print(maps[i][j] + " ");
            }
            System.out.println();
        }
    }

    static void floyd() {
        for (int k = 0; k < n; k++) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    maps[i][j] = Math.min(maps[i][k] + maps[k][j], maps[i][j]);
                }
            }
        }
    }
}
profile
꾸준히 하려고 노력하는 편 💻

0개의 댓글