๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

1238. ํŒŒํ‹ฐ

๋ฌธ์ œ

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


 

์ ‘๊ทผ 1 โญ•

  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ (00:21:37)

๊ฐ๊ฐ์˜ 1~N๋ฒˆ ๋งˆ์„์— ์‚ด๊ณ  ์žˆ๋Š” ํ•™์ƒ๋“ค์ด X๋ฒˆ ๋งˆ์„์„ ์™•๋ณตํ•  ๋•Œ ๊ฐ€์žฅ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ํ•™์ƒ์ด ๋ˆ„๊ตฐ์ง€ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ฆ‰, 1~N๋ฒˆ ๋งˆ์„์—์„œ X๋ฒˆ ๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ , X๋ฒˆ ๋งˆ์„์—์„œ 1~N๋ฒˆ ๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ ๋‹ค์Œ์— 1↔X, 2↔X, …, N↔X ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

๋‘ ๊ฐ€์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ํ•œ๋ฒˆ์— ๊ตฌํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ‘ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ’์ด๋‹ค. ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์€ ๋ชจ๋“  ์ •์ ์—์„œ ์‹œ์ž‘ํ•ด ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค!


 

์ ‘๊ทผ 2 ๐Ÿ”บ

  • ๋‹ค์ต์ŠคํŠธ๋ผ (00:30:12)

๋‘ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ๊ฐ€ ์žˆ๋‹ค.

๐Ÿ’ก 1~N๋ฒˆ ๋งˆ์„์—์„œ X๋ฒˆ ๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ , X๋ฒˆ ๋งˆ์„์—์„œ 1~N๋ฒˆ ๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ ๋‹ค์Œ์— 1↔X, 2↔X, …, N↔X ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ

 

์œ„์˜ ์ ‘๊ทผ๋ฒ•์—์„œ ๋งํ–ˆ๋“ฏ์ด ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด 1~N๋ฒˆ ๋งˆ์„์—์„œ X๋ฒˆ ๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์™€ X๋ฒˆ ๋งˆ์„์—์„œ 1~N๋ฒˆ ๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์„œ ๋‘˜์˜ ํ•ฉ ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ์ถœ๋ ฅํ•ด๋„ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ข€ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์–ด๋А ํ•œ ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ, ์–ด๋–ป๊ฒŒ ‘1~N๋ฒˆ ๋งˆ์„์—์„œ X๋ฒˆ ๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ’๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋‹จ์ˆœํžˆ 1~N๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ตฌํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

์ฒ˜์Œ์— ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์˜€๋Š”๋ฐ, ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ์•„๋‹ˆ๋‹ค! ๋‹จ์ˆœํžˆ ๊ทธ๋ž˜ํ”„์˜ ๊ฐ„์„ ๋“ค์„ ๋’ค์ง‘์œผ๋ฉด ๋œ๋‹ค. ๋’ค์ง‘์€ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  X๋ฒˆ ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋Œ๋ฆฌ๋ฉด ์‹ค์ œ๋กœ๋Š” X ์ •์ ์—์„œ 1~N ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ง€๋งŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” 1~N ์ •์ ์—์„œ X ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค!

 

๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ๋ฐœ์ƒ์˜ ์ „ํ™˜์ด ์กฐ๊ธˆ ํ•„์š”ํ•œ ๋ฌธ์ œ์˜€๋‹ค. ์ด๊ฒŒ ์ƒ๊ฐ์•ˆ๋‚˜์„œ ์งˆ๋ฌธ ๊ฒŒ์‹œํŒ ๋ดค๋‹ค..

์ฐธ๊ณ  : https://www.acmicpc.net/board/view/113888


 

์†Œ์Šค ์ฝ”๋“œ ๐Ÿ’ก

// ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ
public class BOJ_1238 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());

        int[][] shortest = new int[n+1][n+1];
        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < n + 1; j++) {
                if (i == j) shortest[i][j] = 0;
                else shortest[i][j] = 987654321;
            }
        }
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int v1 = Integer.parseInt(st.nextToken());
            int v2 = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());

            shortest[v1][v2] = w;
        }

        for (int v1 = 1; v1 < n+1; v1++) {
            for (int v2 = 1; v2 < n + 1; v2++) {
                for (int v = 1; v < n + 1; v++) {
                    shortest[v2][v] = Math.min(shortest[v2][v], shortest[v1][v] + shortest[v2][v1]);
                }
            }
        }

        int max = 0;
        for (int i = 1; i < n + 1; i++) {
            if (i == x) continue;
            max = Math.max(shortest[i][x] + shortest[x][i], max);
        }
        System.out.println(max);
    }
}
// ๋‹ค์ต์ŠคํŠธ๋ผ
public class BOJ_1238_2 {

    private static class Vertex {
        int v, w;

        public Vertex(int v, int w) {
            this.v = v;
            this.w = w;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());

        LinkedList<LinkedList<Vertex>> graph1 = new LinkedList<>();
        LinkedList<LinkedList<Vertex>> graph2 = new LinkedList<>();
        for (int i = 0; i < n+1; i++) {
            graph1.add(new LinkedList<>());
            graph2.add(new LinkedList<>());
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int v1 = Integer.parseInt(st.nextToken());
            int v2 = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());

            graph1.get(v1).add(new Vertex(v2, w));
            graph2.get(v2).add(new Vertex(v1, w));
        }

        int[] xTov = dijkstra(graph1, x, n);
        int[] vTox = dijkstra(graph2, x, n);

        int max = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) max = Math.max(max, xTov[i] + vTox[i]);
        System.out.println(max);
    }

    private static int[] dijkstra(LinkedList<LinkedList<Vertex>> graph, int v, int n) {
        int[] shortest = new int[n+1];
        Arrays.fill(shortest, 987654321);
        shortest[v] = 0;

        boolean[] visited = new boolean[n+1];

        for (int i = 1; i <= n; i++) {
            int minV = 0;
            int value = Integer.MAX_VALUE;
            for (int j = 1; j <= n; j++) {
                if (value > shortest[j] && !visited[j]) {
                    value = shortest[j];
                    minV = j;
                }
            }

            visited[minV] = true;
            for (Vertex vertex : graph.get(minV)) {
                shortest[vertex.v] = Math.min(shortest[vertex.v], shortest[minV] + vertex.w);
            }
        }

        return shortest;
    }
}