[Boj_18352] ํŠน์ • ๊ฑฐ๋ฆฌ์˜ ๋„์‹œ ์ฐพ๊ธฐ

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

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

 

18352๋ฒˆ: ํŠน์ • ๊ฑฐ๋ฆฌ์˜ ๋„์‹œ ์ฐพ๊ธฐ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N, ๋„๋กœ์˜ ๊ฐœ์ˆ˜ M, ๊ฑฐ๋ฆฌ ์ •๋ณด K, ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ X๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ๋‘ ๊ฐœ

www.acmicpc.net

 

โ–ธ ๋ฌธ์ œ

์–ด๋–ค ๋‚˜๋ผ์—๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€์˜ ๋„์‹œ์™€ M๊ฐœ์˜ ๋‹จ๋ฐฉํ–ฅ ๋„๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ชจ๋“  ๋„๋กœ์˜ ๊ฑฐ๋ฆฌ๋Š” 1์ด๋‹ค.

์ด ๋•Œ ํŠน์ •ํ•œ ๋„์‹œ X๋กœ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋„์‹œ ์ค‘์—์„œ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์ •ํ™•ํžˆ K์ธ ๋ชจ๋“  ๋„์‹œ๋“ค์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋˜ํ•œ ์ถœ๋ฐœ ๋„์‹œ X์—์„œ ์ถœ๋ฐœ ๋„์‹œ X๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ํ•ญ์ƒ 0์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด N=4, K=2, X=1์ผ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ทธ๋ž˜ํ”„๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

 

 

์ด ๋•Œ 1๋ฒˆ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„์‹œ ์ค‘์—์„œ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ 2์ธ ๋„์‹œ๋Š” 4๋ฒˆ ๋„์‹œ ๋ฟ์ด๋‹ค.  2๋ฒˆ๊ณผ 3๋ฒˆ ๋„์‹œ์˜ ๊ฒฝ์šฐ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N, ๋„๋กœ์˜ ๊ฐœ์ˆ˜ M, ๊ฑฐ๋ฆฌ ์ •๋ณด K, ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ X๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ ≤ 300,000, 1 ≤ ≤ 1,000,000, 1 ≤ ≤ 300,000, 1 ≤ ≤ N) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ๋‘ ๊ฐœ์˜ ์ž์—ฐ์ˆ˜ A, B๊ฐ€ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” A๋ฒˆ ๋„์‹œ์—์„œ B๋ฒˆ ๋„์‹œ๋กœ ์ด๋™ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ๋„๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. (1 ≤ A, ≤ N) ๋‹จ, A์™€ B๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ž์—ฐ์ˆ˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

X๋กœ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„์‹œ ์ค‘์—์„œ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ K์ธ ๋ชจ๋“  ๋„์‹œ์˜ ๋ฒˆํ˜ธ๋ฅผ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์ด ๋•Œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„์‹œ ์ค‘์—์„œ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ K์ธ ๋„์‹œ๊ฐ€ ํ•˜๋‚˜๋„ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

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

 

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

  • ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ [์ •์ , ๋น„์šฉ]์„ ์ €์žฅํ•  ์ธ์ ‘๋ฆฌ์ŠคํŠธ์™€ ์‹œ์ž‘์ ์—์„œ ๊ฐ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•  dist ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • ์‹œ์ž‘์ ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ๋œ ์ •์ ๋“ค์„ ๋ฐฉ๋ฌธํ•˜๋ฉฐ, ๋„์ฐฉ์ง€๋กœ ๊ฐ€๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ ๋” ์ž‘์€ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ฐฑ์‹ ํ•ด ์ฃผ์—ˆ๋‹ค.
  • ์ถœ๋ฐœ์ง€์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋„์‹œ ์ค‘ dist ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์™€ k๊ฐ€ ๊ฐ™์€ ๋„์‹œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•ด ์ฃผ์—ˆ๋‹ค.

 

๐Ÿ” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๊ทธ๋ž˜ํ”„์—์„œ ์ •์  ๊ฐ„ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ,
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŠน์ • ์ •์ ์—์„œ ๋‹ค๋ฅธ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ ,
  • ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋“  ์ •์  ๊ฐ„ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.

 

๐Ÿ”  ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra)๋ž€ ?

  • ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํŠน์ • ์ •์ ์—์„œ ๋‹ค๋ฅธ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ์‹œ์ž‘ ์ •์ ์„ ์„ค์ •ํ•˜๊ณ , ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•˜๋ฉด์„œ ๋น„์šฉ์ด ๊ฐ€์žฅ ์ ๊ฒŒ ๋“œ๋Š” ์ •์ ์— ๋ฐฉ๋ฌธํ•ด ๋น„์šฉ์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
  • ์ด๋•Œ ๊ฐ ์ •์ ์˜ ๋น„์šฉ์— ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ฉด์—์„œ ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”ธ ๋‹ค์ต์ŠคํŠธ๋ผ  ๋™์ž‘ ๊ณผ์ •

  • ์ดˆ๊ธฐ์— ์‹œ์ž‘ ์ •์ ์—์„œ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•œ ์ •์ ์— ๋Œ€ํ•œ ๋น„์šฉ์„ ๊ฐฑ์‹ ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ์ •์ ์— ๋Œ€ํ•œ ๋น„์šฉ์€ ๋ฌดํ•œ๋Œ€๋กœ ์„ค์ •ํ•œ๋‹ค.
  • ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์  ์ค‘ ๋น„์šฉ์ด ๊ฐ€์žฅ ์ ๊ฒŒ ๋“œ๋Š” ์ •์ ์— ๋ฐฉ๋ฌธํ•œ๋‹ค.
    • ํ•ด๋‹น ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ •์ ์˜ ๋น„์šฉ์„ ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ๋งŒ์•ฝ, ํ•ด๋‹น ์ •์ ์— ๊ฑฐ์ณ ๋‹ค๋ฅธ ์ •์ ์— ๋ฐฉ๋ฌธํ•  ๋•Œ ๊ธฐ์กด๋ณด๋‹ค ์ ์€ ๋น„์šฉ์ด ๋“ ๋‹ค๋ฉด ๋น„์šฉ์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
  • ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€, ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ •์  ๋ฐฉ๋ฌธ ๋น„์šฉ์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

๋ฒจ๋งŒ-ํฌ๋“œ(Bellman-Ford) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์Œ์˜ ์‚ฌ์ดํด์ด ์žˆ๋‹ค๋ฉด ์ตœ์†Œ ๋น„์šฉ์ด ๋ฌดํ•œํ•˜๊ฒŒ ์ค„์–ด๋“ค์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

  ๋‹ค์ต์ŠคํŠธ๋ผ ๋ฒจ๋งŒ-ํฌ๋“œ
์Œ์˜ ๊ฐ€์ค‘์น˜ X O
์Œ์˜ ์‚ฌ์ดํด X X
์‹œ๊ฐ„ ๋ณต์žก๋„ O(mlog n) O(mn)

 

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

๋ฉ”๋ชจ๋ฆฌ : 346656KB
์‹œ๊ฐ„ : 1436ms
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n, m, k, x;
    static ArrayList<ArrayList<pos>> list;
    static int[] dist;
    static boolean[] checked;
    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));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); // ๋„์‹œ์˜ ๊ฐœ์ˆ˜
        m = Integer.parseInt(st.nextToken()); // ๋„๋กœ์˜ ๊ฐœ์ˆ˜
        k = Integer.parseInt(st.nextToken()); // ๊ฑฐ๋ฆฌ์˜ ์ •๋ณด
        x = Integer.parseInt(st.nextToken()); // ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ

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

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

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

            list.get(a).add(new pos(b, 1));
        }

        dijkstra(x);

        for (int i = 1; i < dist.length; i++) {
            if (dist[i] == k) {
                sb.append(i).append("\n");
            }
        }

        if (sb.length() == 0) sb.append(-1).append("\n");

        System.out.println(sb.toString());
        br.close();
    }

    private static void dijkstra(int start) {
        PriorityQueue<pos> pq = new PriorityQueue<>();
        checked = new boolean[n+1];
        pq.offer(new pos(start, 0));
        dist[start] = 0;

        while (!pq.isEmpty()) {
            pos now = pq.poll();
            int num = now.end;
            checked[num] = true;

            for (pos next : list.get(num)) {
                if (!checked[next.end] && dist[next.end] > dist[num] + next.dist) {
                    dist[next.end] = dist[num] + next.dist;
                    pq.offer(new pos(next.end, dist[next.end]));
                }
            }
        }
    }
}


 

 

๐Ÿ“ ํ•จ๊ป˜ ํ’€์–ด๋ณด๋ฉด ์ข‹์€ ๋ฐฑ์ค€ ๋ฌธ์ œ

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

[Boj_1446] ์ง€๋ฆ„๊ธธ  (0) 2023.11.21
[Boj_1504] ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ  (0) 2023.11.21
[Boj_11279] ์ตœ๋Œ€ ํž™  (0) 2023.11.13
[Boj_11286] ์ ˆ๋Œ“๊ฐ’ ํž™  (0) 2023.11.13
[Boj_1927] ์ตœ์†Œ ํž™  (0) 2023.11.13