๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/ShortestPath

[๋ฐฑ์ค€]11780๋ฒˆ ํ”Œ๋กœ์ด๋“œ2 (Java)

์ ์ด 2022. 2. 21. 22:09
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ (Gold 2)

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

 

11780๋ฒˆ: ํ”Œ๋กœ์ด๋“œ 2

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ n์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ m์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ m+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ ๋ฒ„์Šค์˜ ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ๊ฐ€

www.acmicpc.net


ํ’€์ด

๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ 'ํ”Œ๋กœ์ด๋“œ-์›Œ์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜' ์‚ฌ์šฉ!

์ตœ์†Œ ๋น„์šฉ ์™ธ, ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋‚ด์šฉ๋„ ์ €์žฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด์ฐจ์›๋ฐฐ์—ด ๋ณ€์ˆ˜ ํ•˜๋‚˜ ๋” ์„ ์–ธ

map[i][j]: i -> j ๊ฒฝ๋กœ์˜ ์ตœ์†Œ ๋น„์šฉ ์ €์žฅ

path[i][j]: i์—์„œ ์ถœ๋ฐœํ•ด์„œ j๊นŒ์ง€ ๋„์ฐฉํ•˜๊ธฐ ์ง์ „์— ๋“ค๋ฅด๋Š” ๋„์‹œ

 

๋ฐ”๋กœ ์˜ค๋Š” ๊ธธ(map[i][j])๋ณด๋‹ค ๊ฒฝ๋กœ k๋ฅผ ๊ฑฐ์ณ์„œ ์˜ค๋Š” ๊ธธ(map[i][k] + map[k][j])์ด ๋” ๋น ๋ฅผ ๊ฒฝ์šฐ, 

์ตœ์†Œ ๋น„์šฉ ์ €์žฅ ๋ฐ ๋„์ฐฉ์  j๋กœ ๊ฐ€๊ธฐ ์ „์— ๋“ค๋ฅธ ๊ณณ ์ €์žฅ!

๊ฒฝ๋กœ i -> j๊ฐ€ i->k->j๊ฐ€ ๋˜์—ˆ์œผ๋ฏ€๋กœ, path[i][j]๋Š” j์— ๋„์ฐฉํ•˜๊ธฐ ์ง์ „ ๋“ค๋ฅธ ๊ณณ์ธ path[k][j]๋กœ ์ €์žฅ

 

๊ฒฝ๋กœ ์ถœ๋ ฅ ๋กœ์ง

i->j ๊ฒฝ๋กœ๋ผ๊ณ  ํ•  ๊ฒฝ์šฐ,
j์ „์— ๋“ค๋ ธ๋˜ ๊ณณ์„ ๊ณ„์†ํ•ด์„œ ํƒ€๊ณ  ๊ฐ€์„œ i๋ฅผ ๋งŒ๋‚ ๋•Œ๊นŒ์ง€ ์Šคํƒ์— ๋„ฃ์œผ๋ฉฐ ๋ฐ˜๋ณตํ•˜๋Š” ๋กœ์ง
=> ๋งˆ์ง€๋ง‰ ๋„์ฐฉ์ ๋ถ€ํ„ฐ ์‹œ์ž‘์ ๊นŒ์ง€ ํƒ€๊ณ  ๊ฑฐ๊พธ๋กœ ํƒ€๊ณ  ๊ฐ

์ฝ”๋“œ

๋”๋ณด๊ธฐ
package shortestPath;

import java.util.*;
import java.io.*;

public class Main_11780_ํ”Œ๋กœ์ด๋“œ {
    static final int INF = 10000001;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());
        int[][] map = new int[n+1][n+1];    // ์ตœ๋‹จ๊ฒฝ๋กœ ์ €์žฅ
        int[][] path = new int[n+1][n+1];   // ๋„์ฐฉ์ ์œผ๋กœ ๊ฐ€๊ธฐ ์ง์ „์— ๋“ค๋ฆฐ ์  ์ €์žฅ


        for(int i = 0 ; i < n+1 ; i++){
            for(int j = 0 ; j < n + 1 ; j++){
                if(i == j){
                    map[i][j] = 0;
                    path[i][j] = INF;
                }else{
                    map[i][j] = INF;
                    path[i][j] = INF;
                }
            }
        }

        for(int i = 0 ; i < m ; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            int cost = Integer.parseInt(st.nextToken());

            map[start][end] = Math.min(map[start][end], cost);  // ์ด๋ฏธ ์ €์žฅ๋˜์–ด ์žˆ์„ ์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ, ์ตœ์†Ÿ๊ฐ’ ์ €์žฅ
            path[start][end] = start;
        }

        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(i!=j && map[i][j] > map[i][k] + map[k][j]){  // ๋ฐ”๋กœ ์˜ค๋Š” ๊ธธ(map[i][j])๋ณด๋‹ค ๊ฒฝ๋กœ k๋ฅผ ๊ฑฐ์ณ์„œ ์˜ค๋Š” ๊ธธ(map[i][k] + map[k][j])์ด ๋” ๋น ๋ฅผ ๊ฒฝ์šฐ
                        map[i][j] = map[i][k] + map[k][j];  // ์ตœ์†Œ ๋น„์šฉ ์ €์žฅ
                        path[i][j] = path[k][j];    // ๋„์ฐฉ์  j๋กœ ๊ฐ€๊ธฐ ์ „์—, ๋“ค๋ฅธ ๊ณณ(path[k][j]) ์ €์žฅ
                    }
                }
            }
        }

        for(int i = 1 ; i < n +1 ; i++){
            for(int j = 1; j < n+1 ; j++){
                sb.append(map[i][j]==INF ? 0+" " : map[i][j]+" ");  // ์ตœ์†Œ ๋น„์šฉ ์ถœ๋ ฅ
            }
            sb.append("\n");
        }

        Stack<Integer> stack = new Stack<>();

        for(int i = 1 ; i < n+1 ; i++){
            for(int j = 1 ; j < n+1 ; j++){
                if(path[i][j] == INF) sb.append("0\n"); // ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
                else{
                    int end = j;
                    stack.push(end);
                    /*
                        i->j ๊ฒฝ๋กœ๋ผ๊ณ  ํ•  ๊ฒฝ์šฐ,
                        j์ „์— ๋“ค๋ ธ๋˜ ๊ณณ์„ ๊ณ„์†ํ•ด์„œ ํƒ€๊ณ  ๊ฐ€์„œ
                        i๋ฅผ ๋งŒ๋‚ ๋•Œ๊นŒ์ง€ ์Šคํƒ์— ๋„ฃ์œผ๋ฉฐ ๋ฐ˜๋ณตํ•˜๋Š” ๋กœ์ง
                        => ๋งˆ์ง€๋ง‰ ๋„์ฐฉ์ ๋ถ€ํ„ฐ ์‹œ์ž‘์ ๊นŒ์ง€ ํƒ€๊ณ  ๊ฑฐ๊พธ๋กœ ํƒ€๊ณ  ๊ฐ
                     */
                    while( i != path[i][end] ){
                        end = path[i][end];
                        stack.push(end);
                    }
                    stack.push(i);  // ๋งˆ์ง€๋ง‰์ธ ์‹œ์ž‘์ ๋„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ!
                    sb.append(stack.size());
                    while(!stack.isEmpty()){    // ์‹œ์ž‘์ ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰์ ๊นŒ์ง€ ์ถœ๋ ฅ(stack > FILO)
                        sb.append(" "+stack.pop());
                    }
                    sb.append("\n");
                }
            }
        }
        System.out.println(sb.toString());
    }
}
๋ฐ˜์‘ํ˜•