Algorithm/BOJ

[Boj_1854] K๋ฒˆ์งธ ์ตœ๋‹จ๊ฒฝ๋กœ ์ฐพ๊ธฐ

jeong_ii 2025. 1. 25. 15:13

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

โ–ธ ๋ฌธ์ œ

๋ด„์บ ํ”„๋ฅผ ๋งˆ์นœ ๊น€์ง„์˜ ์กฐ๊ต๋Š” ์—ฌ๋Ÿฌ ๋„์‹œ๋ฅผ ๋Œ๋ฉฐ ์—ฌํ–‰์„ ๋‹ค๋‹ ๊ณ„ํš์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊น€ ์กฐ๊ต๋Š”, '๋А๋ฆผ์˜ ๋ฏธํ•™'์„ ์ค‘์š”์‹œํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ ํ•ญ์ƒ ์ตœ๋‹จ๊ฒฝ๋กœ๋กœ๋งŒ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ๋กœ๋„ ๊ทธ๋ฆฌ ๋งค๋ ฅ์ ์ธ ๊ฒƒ๋งŒ์€ ์•„๋‹ˆ์–ด์„œ, ์ ๋‹นํ•œ ํƒ€ํ˜‘์•ˆ์ธ 'k๋ฒˆ์งธ ์ตœ๋‹จ๊ฒฝ๋กœ'๋ฅผ ๊ตฌํ•˜๊ธธ ์›ํ•œ๋‹ค. ๊ทธ๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ณด์ž.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— n, m, k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1≤n≤1000, 0≤m≤250000, 1≤k≤100, mk≤3000000) n๊ณผ m์€ ๊ฐ๊ฐ ๊น€ ์กฐ๊ต๊ฐ€ ์—ฌํ–‰์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋Š” ๋„์‹œ๋“ค์˜ ๊ฐœ์ˆ˜์™€, ๋„์‹œ ๊ฐ„์— ์กด์žฌํ•˜๋Š” ๋„๋กœ์˜ ์ˆ˜์ด๋‹ค.

์ด์–ด์ง€๋Š” m๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ ๋„๋กœ์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ a, b, c๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ด๊ฒƒ์€ a๋ฒˆ ๋„์‹œ์—์„œ b๋ฒˆ ๋„์‹œ๋กœ ๊ฐˆ ๋•Œ๋Š” c์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. (1≤a,b≤n, 1≤c≤1000)

๋„์‹œ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ n๋ฒˆ๊นŒ์ง€ ์—ฐ์†ํ•˜์—ฌ ๋ถ™์–ด ์žˆ์œผ๋ฉฐ, 1๋ฒˆ ๋„์‹œ๋Š” ์‹œ์ž‘๋„์‹œ์ด๋‹ค. ๋‘ ๋„๋กœ์˜ ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ ์ด ๋ชจ๋‘ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

n๊ฐœ์˜ ์ค„์„ ์ถœ๋ ฅํ•œ๋‹ค. i๋ฒˆ์งธ ์ค„์— 1๋ฒˆ ๋„์‹œ์—์„œ i๋ฒˆ ๋„์‹œ๋กœ ๊ฐ€๋Š” k๋ฒˆ์งธ ์ตœ๋‹จ๊ฒฝ๋กœ์˜ ์†Œ์š”์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

๊ฒฝ๋กœ์˜ ์†Œ์š”์‹œ๊ฐ„์€ ๊ฒฝ๋กœ ์œ„์— ์žˆ๋Š” ๋„๋กœ๋“ค์„ ๋”ฐ๋ผ ์ด๋™ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„๋“ค์˜ ํ•ฉ์ด๋‹ค. i๋ฒˆ ๋„์‹œ์—์„œ i๋ฒˆ ๋„์‹œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” 0์ด์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ k๋ฒˆ์งธ ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” 0์ด ์•„๋‹ ์ˆ˜ ์žˆ์Œ์— ์œ ์˜ํ•œ๋‹ค. ๋˜, k๋ฒˆ์งธ ์ตœ๋‹จ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด −1์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ตœ๋‹จ๊ฒฝ๋กœ์— ๊ฐ™์€ ์ •์ ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ํฌํ•จ๋˜์–ด๋„ ๋œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿ’  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ํ”Œ๋ ˆํ‹ฐ๋„˜ 4
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ์ž๋ฃŒ๊ตฌ์กฐ, ๊ทธ๋ž˜ํ”„ ์ด๋ก , ์ตœ๋‹จ ๊ฒฝ๋กœ, ๋ฐ์ดํฌ์ŠคํŠธ๋ผ, ์šฐ์„ ์ˆœ์œ„ ํ
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

์ด ๋ฌธ์ œ๋Š” 1๋ฒˆ ๋„์‹œ์—์„œ i๋ฒˆ ๋„์‹œ๋กœ ๊ฐ€๋Š” k๋ฒˆ์งธ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

ํ•œ ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ 1์—์„œ 2๋ฒˆ์งธ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด๋ณด์ž.

๋„์‹œ (i) 1๋ฒˆ์งธ ์ตœ๋‹จ ๊ฒฝ๋กœ (1 → i) 2๋ฒˆ์งธ ์ตœ๋‹จ ๊ฒฝ๋กœ (1 → i)
1 0 -1 (๊ฒฝ๋กœ ์กด์žฌ x)
2 2 (1 → 2) 10 (1 → 5 → 2)
3 6 (1 → 2 → 3) 7 (1 → 3)
4 4 (1 → 2 → 4) 5 (1 → 4)
5 6 (1 → 5) 14 (1 → 2 → 3  → 5)

์ผ๋ฐ˜์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด 1๋ฒˆ์งธ ์ตœ๋‹จ ๊ฒฝ๋กœ๋งŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ์—์„œ๋Š” k๋ฒˆ์งธ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋ฏ€๋กœ, ๊ธฐ์กด์˜ int[] dist ๋ฐฐ์—ด๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ, PriorityQueue[] distQue ์šฐ์„ ์ˆœ์œ„ ํ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜์—ฌ 1๋ฒˆ ๋…ธ๋“œ์—์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ k๊ฐœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋•Œ, ์šฐ์„ ์ˆœ์œ„ ํ ๋ฐฐ์—ด์€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๊ฐ€ k๊ฐœ ๋ฏธ๋งŒ์ด๋ผ๋ฉด, ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ด๋ฏธ k๊ฐœ ์ด์ƒ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์ €์žฅ๋œ ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด, ๊ธฐ์กด ๊ฒฝ๋กœ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๊ฐ€ ๋” ์งง์„ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 99924KB
์‹œ๊ฐ„ : 904ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n, k;
    static ArrayList<ArrayList<Pos>> list;
    static PriorityQueue<Integer>[] distQue;
    static public class Pos implements Comparable<Pos> {
        int end; int dist;
        public Pos(int end, int dist) {
            this.end = end; this.dist = dist;
        }
        @Override
        public int compareTo(Pos o) {
            return this.dist - o.dist;
        }
    }
    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()); // ๋„์‹œ์˜ ๊ฐœ์ˆ˜
        int m = Integer.parseInt(st.nextToken()); // ๋„๋กœ์˜ ์ˆ˜
        k = Integer.parseInt(st.nextToken()); // k๋ฒˆ์งธ ์ตœ๋‹จ๊ฒฝ๋กœ

        list = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            list.add(new ArrayList<>());
        }

        int a, b, c;
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            a = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());
            c = Integer.parseInt(st.nextToken());

            list.get(a).add(new Pos(b, c));
        }

        dijkstra();

        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            if (distQue[i].size() == k) {
                sb.append(distQue[i].peek()).append("\n");
            } else sb.append(-1).append("\n"); // k๋ฒˆ์งธ ๊ฒฝ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด -1
        }
        System.out.println(sb);
    }

    private static void dijkstra() {
        distQue = new PriorityQueue[n+1];
        // ๋‚ด๋ฆผ์ฐจ์ˆœ
        for (int i = 0; i <= n; i++) {
            // ์ตœ๋Œ€ k๊ฐœ์˜ ๊ฒฝ๋กœ ์ €์žฅ
            distQue[i] = new PriorityQueue<>((o1,o2)->o2-o1);
        }

        PriorityQueue<Pos> pq = new PriorityQueue<>();
        pq.offer(new Pos(1, 0));
        distQue[1].add(0);

        while (!pq.isEmpty()) {
            Pos now = pq.poll();
            int nowNode = now.end;

            for (Pos next : list.get(nowNode)) {
                int nextNode = next.end;
                int nextDist = now.dist + next.dist;

                // k๊ฐœ์˜ ๊ฒฝ๋กœ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
                if (distQue[nextNode].size() < k) {
                    distQue[nextNode].add(nextDist); // ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ ์ถ”๊ฐ€
                    pq.offer(new Pos(nextNode, nextDist));
                } // ๊ธฐ์กด k๋ฒˆ์งธ ๊ฒฝ๋กœ๋ณด๋‹ค ๋” ์งง์€ ๊ฒฝ๋กœ์ธ ๊ฒฝ์šฐ
                else if (distQue[nextNode].peek() > nextDist) {
                    distQue[nextNode].poll(); // ๊ฐ€์žฅ ๊ธด ๊ฒฝ๋กœ ์ œ๊ฑฐ
                    distQue[nextNode].add(nextDist); // ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ ์ถ”๊ฐ€
                    pq.offer(new Pos(nextNode, nextDist));
                }
            }
        }
    }
}

 

์–ด๋ ต๋‹ค ์–ด๋ ค์›Œ ! ๐Ÿ˜‚๐Ÿ”ฅ