Algorithm/BOJ

[Boj_1504] ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ

jeong_ii 2023. 11. 21. 19:02

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

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

 

1504๋ฒˆ: ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ a, b, c๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, a๋ฒˆ ์ •์ ์—์„œ b๋ฒˆ ์ •์ ๊นŒ์ง€ ์–‘๋ฐฉํ–ฅ ๊ธธ์ด ์กด

www.acmicpc.net

 

โ–ธ ๋ฌธ์ œ

๋ฐฉํ–ฅ์„ฑ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์„ธ์ค€์ด๋Š” 1๋ฒˆ ์ •์ ์—์„œ N๋ฒˆ ์ •์ ์œผ๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ ์„ธ์ค€์ด๋Š” ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ์ด๋™ํ•˜๋Š” ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ์€๋ฐ, ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ์ž„์˜๋กœ ์ฃผ์–ด์ง„ ๋‘ ์ •์ ์€ ๋ฐ˜๋“œ์‹œ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์„ธ์ค€์ด๋Š” ํ•œ๋ฒˆ ์ด๋™ํ–ˆ๋˜ ์ •์ ์€ ๋ฌผ๋ก , ํ•œ๋ฒˆ ์ด๋™ํ–ˆ๋˜ ๊ฐ„์„ ๋„ ๋‹ค์‹œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์ฃผ์˜ํ•˜๋ผ. 1๋ฒˆ ์ •์ ์—์„œ N๋ฒˆ ์ •์ ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์ฃผ์–ด์ง„ ๋‘ ์ •์ ์„ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์น˜๋ฉด์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ a, b, c๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, a๋ฒˆ ์ •์ ์—์„œ b๋ฒˆ ์ •์ ๊นŒ์ง€ ์–‘๋ฐฉํ–ฅ ๊ธธ์ด ์กด์žฌํ•˜๋ฉฐ, ๊ทธ ๊ฑฐ๋ฆฌ๊ฐ€ c๋ผ๋Š” ๋œป์ด๋‹ค. (1 ≤ c ≤ 1,000) ๋‹ค์Œ ์ค„์—๋Š” ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ •์  ๋ฒˆํ˜ธ v1๊ณผ v2๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (v1 ≠ v2, v1 ≠ N, v2 ≠ 1) ์ž„์˜์˜ ๋‘ ์ •์  u์™€ v์‚ฌ์ด์—๋Š” ๊ฐ„์„ ์ด ์ตœ๋Œ€ 1๊ฐœ ์กด์žฌํ•œ๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋‘ ๊ฐœ์˜ ์ •์ ์„ ์ง€๋‚˜๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—†์„ ๋•Œ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

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

 

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

  • ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ [์ •์ , ๋น„์šฉ]์„ ์ €์žฅํ•  ์ธ์ ‘๋ฆฌ์ŠคํŠธ์™€ ์‹œ์ž‘์ ์—์„œ ๊ฐ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•  dist ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ ์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•ด ์ฃผ์—ˆ๋‹ค.
  • dist ๋ฐฐ์—ด์˜ ์ดˆ๊นƒ๊ฐ’ INF๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋‚˜์ง€ ์•Š๋„๋ก ์ตœ๋Œ€ ๊ฐ„์„  ๊ฐœ์ˆ˜ * ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ์ธ 200000000์œผ๋กœ ์„ค์ •ํ•ด ์ฃผ์—ˆ๋‹ค.
  • ์ž„์˜๋กœ ์ฃผ์–ด์ง„ ๋‘ ์ •์ (u, v)์„ ๋ฐ˜๋“œ์‹œ ํ†ต๊ณผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ–ˆ๋‹ค.
    • i -> u -> v -> n
    • i -> v -> u -> n
  • 1๋ฒˆ์˜ ๊ฒฝ์šฐ, 1์—์„œ u๊นŒ์ง€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰, u์—์„œ v๊นŒ์ง€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰, v์—์„œ n๊นŒ์ง€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์— ๋Œ€ํ•ด ๋ชจ๋‘ ๋”ํ•ด์ค€๋‹ค.
  • 2๋ฒˆ์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ๊ฐ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋”ํ•ด์ค€ ํ›„, 1๋ฒˆ์—์„œ ๊ตฌํ•œ ๊ฒฐ๊ด๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ์ถœ๋ ฅํ–ˆ๋‹ค.
  • ์ด๋•Œ, 1๋ฒˆ์˜ ๊ฒฝ์šฐ์™€ 2๋ฒˆ์˜ ๊ฒฝ์šฐ์—์„œ ์–ป์–ด๋‚ธ ๊ฐ’์ด  INF๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด u, v๋ฅผ ๊ฑฐ์ณ n์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ -1์„ ์ถœ๋ ฅํ–ˆ๋‹ค.

 

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

๋ฉ”๋ชจ๋ฆฌ : 68612KB
์‹œ๊ฐ„ : 820ms
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, e;
    static int u, v;
    static ArrayList<ArrayList<pos>> list;
    static int[] dist;
    static boolean[] checked;
    static PriorityQueue<pos> pq;

    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;
        }
    }
    static int INF = 200000000; // ์ตœ๋Œ€ ๊ฐ„์„  ๊ฐœ์ˆ˜ * ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); // ์ •์ ์˜ ๊ฐœ์ˆ˜
        e = Integer.parseInt(st.nextToken()); // ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜

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

        for (int i = 0; i < e; i++) {
            st = new StringTokenizer(br.readLine());
            // a -> b, b -> a
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            // ๊ทธ ๊ฑฐ๋ฆฌ๊ฐ€ c
            int c = Integer.parseInt(st.nextToken());

            // ์–‘๋ฐฉํ–ฅ
            list.get(a).add(new pos(b, c));
            list.get(b).add(new pos(a, c));
        }

        // ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ •์ 
        st = new StringTokenizer(br.readLine());
        u = Integer.parseInt(st.nextToken());
        v = Integer.parseInt(st.nextToken());

        int distA = 0; // u -> v์ผ๋•Œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ
        distA += dijkstra(1, u);
        distA += dijkstra(u, v);
        distA += dijkstra(v, n);

        int distB = 0; // v -> u์ผ๋•Œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ
        distB += dijkstra(1, v);
        distB += dijkstra(v, u);
        distB += dijkstra(u, n);

        int ans = (distA >= INF && distB >= INF) ? -1 : Math.min(distA, distB);
        bw.append(ans + "\n");
        bw.flush();
        bw.close();
        br.close();
    }

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

        pq = new PriorityQueue<>();
        pq.offer(new pos(start, 0));
        checked = new boolean[n+1];
        dist[start] = 0;

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

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


 

 

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