ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]11404: 플로이드 - JAVA
    문제풀이/백준 2021. 2. 17. 15:11

    [백준]11404: 플로이드 

    www.acmicpc.net/problem/11404

     

    11404번: 플로이드

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

    www.acmicpc.net

    풀이

    최단거리 알고리즘 공부한 기념으로 관련 문제들을 풀어보았다.

     

    이 문제는 플로이드-워샬 알고리즘을 쓰면 바로 답이 나온다! 모든 정점에서 모든 정점까지의 최단거리를 구하는 문제이다.

     

    문제를 꼭 제대로 읽자! 출력 설명에 i에서 j로 가는 길이 없으면 0을 출력한다고 되어있다. 이를 체크 안해주면 98프로에서 틀린다. 꼭꼭 문제를 제대로 읽자.

     

    코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    import java.util.*;
     
    public class Main {    
        
        static int[][] node;
        
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            
            int n = scan.nextInt();
            int m = scan.nextInt();
            
            node = new int[n + 1][n + 1];
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    node[i][j] = 100000001;
                }
                node[i][i] = 0;
            }
            
            for(int i = 0; i < m; i++) {
                int start = scan.nextInt();
                int end = scan.nextInt();
                int cost = scan.nextInt();
                if(node[start][end] > cost) node[start][end] = cost;
            }
            
            //플로이드-워샬
            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(node[i][j] > node[i][k] + node[k][j])
                            node[i][j] = node[i][k] + node[k][j];
                    }
                }
            }
            
            for(int i = 1; i < n + 1; i++) {
                for(int j = 1; j < n + 1; j++) {
                    if(node[i][j] == 100000001) System.out.print("0 "); //i -> j로 갈 수 없는 경우 0출력
                    else System.out.print(node[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
    cs

    '문제풀이 > 백준' 카테고리의 다른 글

    [백준]2341: DDR - JAVA  (0) 2021.02.18
    [백준]1238: 파티 - JAVA  (0) 2021.02.17
    [백준]2887: 행성 터널 - JAVA  (0) 2021.02.16
    [백준]1922: 네트워크 연결  (0) 2021.02.16
    [백준]1766: 문제집 - JAVA  (0) 2021.02.15

    댓글

Designed by Tistory.