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

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

1800. ์ธํ„ฐ๋„ท ์„ค์น˜

Problem ๐Ÿ’ป

๊ฒฐ์ • ๋ฌธ์ œ๋กœ ์ด๋ถ„ํƒ์ƒ‰ + ๋‹ค์ต์ŠคํŠธ๋ผ or BFS, DFS๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ปดํ“จํ„ฐ N๊ฐœ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š”๋ฐ, ์–ด๋–ค ๋น„์šฉ X์— ๋Œ€ํ•˜์—ฌ ํ•ด๋‹น ๋น„์šฉ X๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ˆ์„ ๋‚ด๊ณ , ํฌ๋ฉด ๋ฌด๋ฃŒ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋„๋ก ๋ฌธ์ œ์˜ ์š”๊ตฌ ์กฐ๊ฑด์„ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.

 

 

Approach 1 โญ•

  • ์ด๋ถ„ํƒ์ƒ‰ + ๋‹ค์ต์ŠคํŠธ๋ผ

์ด๋ถ„ํƒ์ƒ‰์„ ํ†ตํ•˜์—ฌ ์ตœ์†Œํ•œ์œผ๋กœ ๋‚ด์•ผํ•  ๊ธˆ์•ก์„ ๊ฒฐ์ •ํ•˜๊ณ , ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ํ†ตํ•ด ๋ฌด๋ฃŒ๋กœ ์—ฐ๊ฒฐํ•œ ํšŸ์ˆ˜๋ฅผ ๊ฐ€์ค‘์น˜๋กœ ํ•˜์—ฌ 1 → N ์ปดํ“จํ„ฐ๋กœ์˜ ์ตœ์†Œ ๋ฌด๋ฃŒ ์—ฐ๊ฒฐ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•œ ๋‹ค์Œ ํ•ด๋‹น ํšŸ์ˆ˜๊ฐ€ k๋ฅผ ๋„˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

k๋ฅผ ๋„˜๋Š”๋‹ค๋ฉด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ๋‹ค์‹œ ๋น„์šฉ์„ ๋” ์ฆ๊ฐ€์‹œ์ผœ๋ณด๊ณ , k๋ฅผ ๋„˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ๋น„์šฉ์„ ๋” ์ค„์ผ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•ด์„œ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ์ตœ์†Œ 4์˜ ๋น„์šฉ์€ ๋˜์–ด์•ผ 1 → N์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์˜จ๋‹ค.

 

Solution ๐Ÿ’ก

public class BOJ_1800 {

    private static int n, p, k;
    private static ArrayList<ArrayList<Vertex>> graph;

    static class Vertex implements Comparable<Vertex> {
        int v, w;

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

        @Override
        public int compareTo(Vertex o) {
            return this.w - o.w;
        }
    }

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        p = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        graph = new ArrayList<>();
        for (int i = 0; i <= n; i++) graph.add(new ArrayList<>());
        for (int i = 0; i < p; i++) {
            st = new StringTokenizer(br.readLine());
            int v1 = Integer.parseInt(st.nextToken());
            int v2 = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());

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

        int ans = -1;
        int left = 0;
        int right = 1_000_001;
        while (left <= right) {
            int mid = (left + right) / 2;

            if (dijkstra(mid)) {
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        System.out.println(ans);
    }

    private static boolean dijkstra(int x) {
        PriorityQueue<Vertex> pq = new PriorityQueue<>();
        pq.add(new Vertex(1, 0));

        int[] shortest = new int[n+1];
        Arrays.fill(shortest, Integer.MAX_VALUE);
        shortest[1] = 0;

        while (!pq.isEmpty()) {
            Vertex vertex = pq.poll();

            if (shortest[vertex.v] < vertex.w) continue;
            for (int idx = 0; idx < graph.get(vertex.v).size(); idx++) {
                int nextValue = vertex.w;
                Vertex next = graph.get(vertex.v).get(idx);
                if (next.w > x)
                    nextValue++;
                if (nextValue < shortest[next.v]) {
                    shortest[next.v] = nextValue;
                    pq.add(new Vertex(next.v, nextValue));
                }
            }
        }

        return shortest[n] <= k;
    }
}

 

Reference ๐Ÿ“„

https://dlwnsdud205.tistory.com/205

https://justicehui.github.io/usaco/2019/07/12/BOJ1800/