๋ฌธ์  (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());
    }
}'๐ ์๊ณ ๋ฆฌ์ฆ > ShortestPath' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [LeetCode] 1091. Shortest Path in Binary Matrix (ํด์, Kotlin ํ์ด) (0) | 2023.06.19 | 
|---|---|
| [๋ฐฑ์ค] 13549๋ฒ: ์จ๋ฐ๊ผญ์ง3 (0) | 2022.04.03 | 
| [๋ฐฑ์ค] 1238๋ฒ: ํํฐ (JAVA) (0) | 2022.04.03 | 
| [๋ฐฑ์ค] 16118๋ฒ ๋ฌ๋น์ฌ์ฐ (Java) (0) | 2022.02.08 | 
| [๋ฐฑ์ค] 1753๋ฒ ์ต๋จ๊ฒฝ๋ก (Java) (0) | 2021.08.24 | 
