๋ฐ˜์‘ํ˜•
Notice
Recent Posts
Recent Comments
Link
ยซ   2025/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
03-11 05:31
๊ด€๋ฆฌ ๋ฉ”๋‰ด

ImJay

[BOJ/Java] 9370. ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ - Java

[BOJ/Java] 9370. ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€

ImJay 2025. 3. 10. 10:05
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ [BOJ/Java] 9370. ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€


๐Ÿ’ก ๋ฌธ์ œ ํ•ด์„

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

๐Ÿš— ์ฃผ์–ด์ง„ ์ •๋ณด:

  • n: ๊ต์ฐจ๋กœ(๋…ธ๋“œ) ๊ฐœ์ˆ˜
  • m: ๋„๋กœ(๊ฐ„์„ ) ๊ฐœ์ˆ˜
  • t: ๋ชฉ์ ์ง€ ํ›„๋ณด ๊ฐœ์ˆ˜
  • s: ์ถœ๋ฐœ์ง€
  • g, h: ๋ฐ˜๋“œ์‹œ ์ง€๋‚˜์•ผ ํ•˜๋Š” ๋„๋กœ์˜ ๋‘ ์ •์ 
  • m๊ฐœ์˜ ๊ฐ„์„  ์ •๋ณด (์–‘๋ฐฉํ–ฅ, ๊ฐ€์ค‘์น˜ ํฌํ•จ)
  • t๊ฐœ์˜ ๋ชฉ์ ์ง€ ํ›„๋ณด

๐Ÿš€ ๋ชฉํ‘œ:

  • s → ๋ชฉ์ ์ง€๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ์ค‘ g-h ๋„๋กœ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ง€๋‚˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ฐพ๊ธฐ
  • ๊ฐ€๋Šฅํ•œ ๋ชฉ์ ์ง€๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ถœ๋ ฅ

์˜ˆ์ œ ์ž…๋ ฅ:

2
6 9 2
2 3 6
1 2 1
1 3 2
2 4 4
2 5 3
3 6 5
4 6 2
5 6 3
4
6

 


์œ„์˜ ์˜ˆ์ œ์—์„œ 2 → 6์œผ๋กœ ๊ฐˆ ๋•Œ 3-6์„ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋ชฉ์ ์ง€๋ฅผ ์ฐพ๋Š”๋‹ค.


๐Ÿ“ ํ’€์ด ๊ณผ์ •

1๏ธโƒฃ ๋‹ค์ต์ŠคํŠธ๋ผ (Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™œ์šฉ

๐Ÿ”น ์ถœ๋ฐœ์ ์—์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•œ๋‹ค.
๐Ÿ”น g-h ๋„๋กœ๋ฅผ ์ง€๋‚˜๋Š” ๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๋”ฐ๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

2๏ธโƒฃ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ (3๋ฒˆ์˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์‹คํ–‰)

โœ… s์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
โœ… g์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
โœ… h์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ

3๏ธโƒฃ ๋ชฉ์ ์ง€ ํ›„๋ณด ํŒ๋ณ„

๐Ÿ’ก s → ๋ชฉ์ ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ s → g → h → ๋ชฉ์ ์ง€ ๋˜๋Š” s → h → g → ๋ชฉ์ ์ง€ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ


๐Ÿ’ป ์ฝ”๋“œ (Java)

import java.util.*;

public class Main {
    static final int INF = 200000000;
    static int n, m, t, s, g, h;
    static List<Node>[] graph;
    static int[] targets;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();  // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐœ์ˆ˜

        while (T-- > 0) {
            n = sc.nextInt();
            m = sc.nextInt();
            t = sc.nextInt();
            s = sc.nextInt();
            g = sc.nextInt();
            h = sc.nextInt();

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

            int ghDist = 0;  // g-h ๊ฐ„์„ ์˜ ๊ฑฐ๋ฆฌ ์ €์žฅ
            for (int i = 0; i < m; i++) {
                int a = sc.nextInt();
                int b = sc.nextInt();
                int d = sc.nextInt();
                graph[a].add(new Node(b, d));
                graph[b].add(new Node(a, d));
                if ((a == g && b == h) || (a == h && b == g)) {
                    ghDist = d;
                }
            }

            targets = new int[t];
            for (int i = 0; i < t; i++) {
                targets[i] = sc.nextInt();
            }

            // 3๋ฒˆ์˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์‹คํ–‰
            int[] distFromS = dijkstra(s);
            int[] distFromG = dijkstra(g);
            int[] distFromH = dijkstra(h);

            List<Integer> result = new ArrayList<>();

            for (int target : targets) {
                int directDist = distFromS[target];
                int viaG = distFromS[g] + ghDist + distFromH[target];
                int viaH = distFromS[h] + ghDist + distFromG[target];

                if (directDist == viaG || directDist == viaH) {
                    result.add(target);
                }
            }

            Collections.sort(result);
            for (int x : result) {
                System.out.print(x + " ");
            }
            System.out.println();
        }
    }

    static int[] dijkstra(int start) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        int[] dist = new int[n + 1];
        Arrays.fill(dist, INF);
        dist[start] = 0;
        pq.offer(new Node(start, 0));

        while (!pq.isEmpty()) {
            Node cur = pq.poll();
            int now = cur.index, cost = cur.distance;

            if (dist[now] < cost) continue;

            for (Node next : graph[now]) {
                int newCost = cost + next.distance;
                if (newCost < dist[next.index]) {
                    dist[next.index] = newCost;
                    pq.offer(new Node(next.index, newCost));
                }
            }
        }
        return dist;
    }

    static class Node implements Comparable<Node> {
        int index, distance;
        public Node(int index, int distance) {
            this.index = index;
            this.distance = distance;
        }
        public int compareTo(Node o) {
            return Integer.compare(this.distance, o.distance);
        }
    }
}

โฑ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜: O((V + E) log V)
  • 3๋ฒˆ์˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์‹คํ–‰: O(3 * (V + E) log V)
  • n ≤ 2000, m ≤ 50,000์ด๋ฏ€๋กœ ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅ

๐Ÿง ๋Š๋‚€ ์ 

๐ŸŒŸ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ํ™œ์šฉํ•˜๋Š” ์‘์šฉ ๋ฌธ์ œ์˜€๋‹ค.
โžก๏ธ ๊ธฐ๋ณธ์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ 3๋ฒˆ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค.
โžก๏ธ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ง€๋‚˜์•ผ ํ•˜๋Š” ์กฐ๊ฑด์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿ” ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„์—์„œ ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฌ์› ๋‹ค.
โœ… g-h ๊ฐ„์„ ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ •ํ™•ํžˆ ์ €์žฅํ•ด์•ผ ํ–ˆ๋‹ค.
โœ… ๋‹ค์ต์ŠคํŠธ๋ผ ์‹คํ–‰ ํ›„, ํ›„๋ณด ๋ชฉ์ ์ง€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๋กœ์ง์ด ์ค‘์š”ํ–ˆ๋‹ค.
โœ… ์ตœ์ข…์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ถœ๋ ฅ์„ ์žŠ์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ–ˆ๋‹ค.

๐Ÿš€ ์ „์ฒด์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ํƒ„ํƒ„ํ•˜๊ฒŒ ๋‹ค์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค! ๐Ÿ˜Š

๋ฐ˜์‘ํ˜•
Comments