본문 바로가기

알고리즘/백준

11404 - 플로이드(G4)

목차

    1. 문제

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

    2. 풀이

    플로이드 워셜 알고리즘을 사용하여 쉽게 풀 수 있는 문제였다.
    다만, 입력값 중 동일 경로에 다른 비용이 존재하는 점, INF 값을 너무 크게 할 경우 오버플로우가 날 수 있다는 점과 적을 경우 값이 적용되지 않는다는 점을 유의하도록 하자.

    3. 코드

    public class BOJ_11404_플로이드 {
    	static final int INF = Integer.MAX_VALUE / 2 - 1;
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		
    		int N = Integer.parseInt(br.readLine());
    		int M = Integer.parseInt(br.readLine());
    		
    		int map[][] = new int[N][N];
    		for (int i = 0; i < N; i++) {
    			Arrays.fill(map[i], INF);
    		}
    		
    		//값 채우기
    		while(M-- > 0) {
    			StringTokenizer st = new StringTokenizer(br.readLine());
    			int start = Integer.parseInt(st.nextToken()) - 1;
    			int end = Integer.parseInt(st.nextToken()) - 1;
    			int cost = Integer.parseInt(st.nextToken());
    			map[start][end] = Math.min(map[start][end], cost);
    		}
    		
    		//계산
    		for (int k = 0; k < N; k++) { //경유지
    			for (int i = 0; i < N; i++) { //출발
    				if(i == k) continue; //출발지와 경유지가 같다면 스킵
    				for (int j = 0; j < N; j++) { //도착지
    					if(i == j || k == j) continue; //출발지와 도착지, 혹은 경유지와 도착지가 같을 수 없음
    					map[i][j] = Math.min(map[i][k] + map[k][j], map[i][j]);
    				}
    			}
    		}
    		
    		//출력
    		for (int i = 0; i < N; i++) {
    			for (int j = 0; j < N; j++) {
    				if(map[i][j] == INF) bw.write("0 ");
    				else bw.write(map[i][j] + " ");
    			}
    			bw.write("\n");
    		}
    		bw.close();
    	}
    
    }

    '알고리즘 > 백준' 카테고리의 다른 글

    1780 - 종이의 개수(S2)  (0) 2023.11.02
    2630 - 색종이 만들기(S2)  (0) 2023.11.02
    16928 - 뱀과사다리게임(G5)  (0) 2023.11.02
    17141 - 연구소(G4)  (0) 2023.11.02
    7576 - 토마토(G5)  (1) 2023.10.24