๊ธฐ๋ก๋ฐฉ

BOJ_1238 : ํŒŒํ‹ฐ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1238 : ํŒŒํ‹ฐ

Soom_1n 2023. 6. 27. 21:23

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

1238๋ฒˆ: ํŒŒํ‹ฐ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ž…๋ ฅ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ M+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ i๋ฒˆ์งธ ๋„๋กœ์˜ ์‹œ์ž‘์ , ๋์ , ๊ทธ๋ฆฌ๊ณ  ์ด ๋„๋กœ๋ฅผ ์ง€๋‚˜๋Š”๋ฐ ํ•„์š”ํ•œ ์†Œ์š”์‹œ๊ฐ„ Ti๊ฐ€ ๋“ค์–ด

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • N๋ช…์˜ ์‚ฌ๋žŒ๊ณผ M๊ฐœ์˜ ๋„๋กœ๊ฐ€ ์žˆ๋‹ค.
    • X๋ฒˆ ์‚ฌ๋žŒ์˜ ์ง‘์— ๋ชจ๋‘๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋กœ ๋ชจ์ด๊ณ  ์ง‘์— ๊ฐˆ ๋•Œ, ์†Œ์š”์‹œ๊ฐ„์˜ ์ตœ๋Œ€ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
    • ๊ฐ ์ง‘ ์‚ฌ์ด์˜ ๋„๋กœ๋Š” ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ์ด๋‹ค.
  • ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ  ๊ทธ ์ค‘ ์ตœ๋Œ€ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.
    • ๊ฐ์ž ์ง‘์—์„œ ํŒŒํ‹ฐ๋กœ ๊ฐˆ ๋•Œ๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ N-1๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ํŒŒํ‹ฐ์—์„œ ์ง‘์œผ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ๋Š” ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋กœ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค. (๋˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ N-1๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค)

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    private static class Edge implements Comparable<Edge> {
        int node, weight;

        public Edge(int node, int weight) {
            this.node = node;
            this.weight = weight;
        }

        @Override
        public int compareTo(Edge o) {
            return this.weight - o.weight;
        }
    }

    private static int N, M, X;
    private static ArrayList<Edge>[] adjList;
    private static boolean[] visited;

    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken()); // ํ•™์ƒ(์ง‘) ์ˆ˜
        M = Integer.parseInt(st.nextToken()); // ๋„๋กœ ์ˆ˜
        X = Integer.parseInt(st.nextToken()); // ํŒŒํ‹ฐ ์ง‘ ๋ฒˆํ˜ธ

        adjList = new ArrayList[N + 1]; // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ : ๋‹ค์ต์ŠคํŠธ๋ผ์šฉ

        for (int i = 1; i <= N; i++) {
            adjList[i] = new ArrayList<>();
        }

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

            Edge temp = new Edge(end, time);
            adjList[start].add(temp);
        }

        // Prim
        int[] goToHome = new int[N + 1];
        Arrays.fill(goToHome, Integer.MAX_VALUE);

        PriorityQueue<Edge> pq = new PriorityQueue<>(); // ์šฐ์„ ์ˆœ์œ„ ํ : ํ”„๋ฆผ์šฉ
        visited = new boolean[N + 1];

        pq.add(new Edge(X, 0));

        while (!pq.isEmpty()) {
            Edge now = pq.poll();

            if (visited[now.node]) continue; //์ด๋ฏธ ๋ฐฉ๋ฌธ ํ•œ ๋…ธ๋“œ๋ฉด ๋‹ค์‹œ ๋ฝ‘๊ธฐ

            visited[now.node] = true;
            goToHome[now.node] = now.weight;

            for (Edge e : adjList[now.node]) {
                if (!visited[e.node]) {
                    pq.add(new Edge(e.node, e.weight + goToHome[now.node]));
                }
            }
        }
//        System.out.println(Arrays.toString(goToHome));

        // Dijkstra
        int[] goToParty = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            if (i == X)
                goToParty[i] = 0;
            else
                goToParty[i] = dijkstra(i, X);
        }
//        System.out.println(Arrays.toString(goToParty));

        // Output
        int max = 0;
        for (int i = 1; i <= N; i++) {
            max = Math.max(max, goToHome[i] + goToParty[i]);
        }

        bw.write(Integer.toString(max));
        bw.flush();
    }

    private static int dijkstra(int start, int end) {
        int[] dist = new int[N + 1];
        Arrays.fill(dist, Integer.MAX_VALUE);

        PriorityQueue<Edge> pq = new PriorityQueue<>();

        dist[start] = 0;
        pq.add(new Edge(start, 0));

        while (!pq.isEmpty()) {
            Edge now = pq.poll();

            for (Edge e : adjList[now.node]) {
                int nw = now.weight + e.weight;
                if (dist[e.node] > nw) {
                    dist[e.node] = nw;
                    pq.add(new Edge(e.node, nw));
                }
            }
        }

        return dist[end];
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ adjList์— ์ €์ •ํ•œ๋‹ค.
  • Prim ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ X๋ฒˆ ์ง‘์—์„œ ๊ฐ์ž์˜ ์ง‘์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ด goToHome ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.
  • Dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ์ž์˜ ์ง‘์—์„œ X๋ฒˆ ์ง‘์— ์˜ค๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ด goToParty ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.
    • n-1๋ฒˆ dijkstra ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์ผ์ฐ ํŒŒ์•…ํ•˜๊ณ , ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ํ”„๋ฆผ ์„ ํƒ๋„ ๋ฐ”๋กœ ์ƒ๊ฐ๋‚ฌ์ง€๋งŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค์—ˆ๋‹ค.
    • ์•„์ง ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•™์Šต๊ณผ ์—ฐ์Šต์ด ๋” ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_1753 : ์ตœ๋‹จ๊ฒฝ๋กœ  (0) 2023.07.02
BOJ_1504 : ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ  (0) 2023.06.28
BOJ_1167 : ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„  (0) 2023.06.25
BOJ_15663 : N๊ณผ M (9)  (0) 2023.06.11
BOJ_1043 : ๊ฑฐ์ง“๋ง  (0) 2023.06.09