백준/그래프

[백준] 11404 : 플로이드

믕비 2024. 9. 4. 13:44
반응형

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

 

[문제풀이]

플로이드 워셜 알고리즘 문제였다.

플로이드 워셜 알고리즘이란 모든 정점에서 모든 정점까지의 최단 거리를 구하는 것으로,

초기 그래프를 행과 열이 같은 곳을 제외하고 매우 큰 값으로 저장하여 최솟값으로 갱신하며 최단 거리를 찾는 알고리즘이다.

 

출력 할 때 INF으로 남은 값을 0으로 초기화해주어야 했는데 그 부분을 놓쳤다. 좀 더 꼼꼼하게 풀자! 

 

[코드]

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

/*
n개의 도시.
한 도시에서 출발하여 다른 도시에 도착하는 m개의 버스.
각 버스는 한 번 사용할 때 필요한 비용이 있음.
모든 도시의 쌍 (A,B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하라.
 */
public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;

    static final int INF = 100_000_000;
    static int n, m;
    static int[][] costs;

    public static void main(String[] args) throws IOException{
        init();
        floydWarshall();
        /*
        [출력]
        a에서 b로 가는 최소 비용을 나타내는 그래프 출력.
        갈 수 없으면 0을 출력
         */
        for(int[] row : costs){
            for(int column : row){
                if(column == INF){
                    sb.append(0 + " ");
                }else {
                    sb.append(column + " ");
                }
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }

    static void init() throws IOException {
        /*
        [입력]
        1. 도시의 개수 n (2 <= n <= 100)
        2. 버스의 개수 m (1 <= m <= 100,000)
        3~m+2. 시작 도시 a, 도착 도시 b, 비용 c (a와 b가 같은 경우 없음. 비용은 100,000보다 이하의 자연수)
         */
        n = Integer.parseInt(br.readLine());
        m = Integer.parseInt(br.readLine());
        costs = new int[n][n];

        //그래프 초기화
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                //같으면 0
                if(i == j){
                    costs[i][j] = 0;
                }
                //아니면 INF로 초기화
                else{
                    costs[i][j] = INF;
                }
            }
        }

        for(int i = 0; i < m; i++){
            st = new StringTokenizer(br.readLine());
            int row = Integer.parseInt(st.nextToken()) - 1;
            int column = Integer.parseInt(st.nextToken()) - 1;
            int cost = Integer.parseInt(st.nextToken());

            //더 작은 비용의 값을 저장해줌
            costs[row][column] = Math.min(costs[row][column], cost);
        }
    }

    static void floydWarshall(){
        for(int k = 0; k < n; k++){
            for(int i = 0; i < n; i++){
                for(int j = 0; j < n; j++){
                    //최단 경로 초기화
                    if(costs[i][j] > costs[i][k] + costs[k][j]){
                        costs[i][j] = costs[i][k] + costs[k][j];
                    }
                }
            }
        }
    }
}
반응형

'백준 > 그래프' 카테고리의 다른 글

[백준] 1753 : 최단경로 (JAVA)  (2) 2024.09.17
[백준] 11779 : 최소비용 구하기 2  (1) 2024.09.13