๊ธฐ๋ก๋ฐฉ

BOJ_1504 : ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ณธ๋ฌธ

CodingTest/Java

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

Soom_1n 2023. 6. 28. 20:42

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

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

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

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • N๊ฐœ์˜ ๋…ธ๋“œ์™€ E๊ฐœ์˜ ๊ฐ„์„ ์ด ์žˆ๋‹ค.
    • 1๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ N๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š”๋ฐ v1๊ณผ v2 ๋…ธ๋“œ๋ฅผ ๊ฒฝ์œ ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ™œ์šฉ์œผ๋กœ ํ’€์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (๋‚œ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ƒ๊ฐํ–ˆ๋‹ค)
    • ๊ฒฝ๋กœ๋Š” 2๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. (1 > A > B > N , 1 > B > A > N)
      • ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ๋Š” 1 > A, A > B, B > N ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
      • ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ๋Š” 1 > B, B > A, A > N ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
      • ๋ฌด๋ฐฉํ–ฅ ๊ฐ„์„ ์ด๋ฏ€๋กœ A > B์™€ B > A๋Š” ๊ฐ™๋‹ค.
    • ์ด 3๋ฒˆ์˜ ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
      1. 1๋ถ€ํ„ฐ A์™€ 1๋ถ€ํ„ฐ B
      2. A๋ถ€ํ„ฐ B, A๋ถ€ํ„ฐ N
      3. B๋ถ€ํ„ฐ N
    • ๋‘ ๊ฒฝ์šฐ์—์„œ ๋” ์งง์€ ๊ฒฝ์šฐ๋ฅผ ๊ณจ๋ผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    private static class Edge implements Comparable<Edge> {
        int node, weight;

        public Edge(int node, int weight) {
            this.node = node;
            this.weight = weight;
        }

        @Override
        public int compareTo(Edge o) {
            return this.weight - o.weight;
        }
    }

    private static ArrayList<Edge>[] adjList;
    private static int[] dist;
    private static final int INF = 200_000_000;

    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int E = Integer.parseInt(st.nextToken());
        adjList = new ArrayList[N + 1];
        for (int i = 1; i <= N; i++) {
            adjList[i] = new ArrayList<>();
        }

        for (int i = 0; i < E; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            adjList[a].add(new Edge(b, c));
            adjList[b].add(new Edge(a, c));
        }

        st = new StringTokenizer(br.readLine());
        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());

        // prim
        dist_init(N + 1);
        prim(1);
        int StoA = dist[A];
        int StoB = dist[B];
//        System.out.println(Arrays.toString(dist));

        dist_init(N + 1);
        prim(A);
        int AtoB = dist[B];
        int AtoN = dist[N];
//        System.out.println(Arrays.toString(dist));

        dist_init(N + 1);
        prim(B);
        int BtoN = dist[N];
//        System.out.println(Arrays.toString(dist));

        // Output
        int res = INF;
        int SABN = StoA + AtoB + BtoN;
        int SBAN = StoB + AtoB + AtoN;

        res = Math.min(res, SABN);
        res = Math.min(res, SBAN);

        if (AtoB == INF || res == INF)
            bw.write("-1");
        else {
            bw.write(Integer.toString(res));
        }
        bw.flush();
    }

    private static void prim(int start) {
        PriorityQueue<Edge> pq = new PriorityQueue<>();
        pq.add(new Edge(start, 0));

        while (!pq.isEmpty()) {
            Edge edge = pq.poll();

            if (dist[edge.node] < INF) continue;
            dist[edge.node] = edge.weight;

            for (Edge e : adjList[edge.node]) {
                if (dist[e.node] > edge.weight + e.weight)
                    pq.add(new Edge(e.node, edge.weight + e.weight));
            }
        }
    }

    private static void dist_init(int N) {
        dist = new int[N];
        Arrays.fill(dist, INF);
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฌ์šฉ ํ•  ๊ฐ„์„  ํด๋ž˜์Šค Edge๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.
  • ๋…ธ๋“œ์˜ ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด adjList๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.
  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด dist๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.
  • ๋ฌธ์ œ์—์„œ ๊ฐ„์„ ์˜ ์ตœ๋Œ€ ์ˆ˜๋Š” 20๋งŒ๊ฐœ์ด๊ณ , ๊ฐ€์ค‘์น˜๋Š” 1,000๊นŒ์ง€ ์ด๋ฏ€๋กœ ๋ฌดํ•œ๋Œ€ ๊ฐ’์€ 2์–ต์œผ๋กœ ๋‘๊ณ  INF์— ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • 3๋ฒˆ์˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋Œ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ด ์ตœ์†Œ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๊ฐ€ ๋ฌดํ•œ๋Œ€๊ฐ€ ๋‚˜์˜ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๋‹ค์ต์ŠคํŠธ๋ผ ํ™œ์šฉ ๋ฌธ์ œ๋กœ ๊ฐ„๋‹จํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ, ํ’€๋•Œ๋Š” ์•„์ฃผ ๊ณ ์ƒ์„ ๋งŽ์ด ํ•œ ๋ฌธ์ œ์ด๋‹ค.
    • ์ฒ˜์Œ์—” BFS๋กœ ์ ‘๊ทผํ•ด์„œ v1, v2 ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ์—์„œ ๋“ค๊ณ ๋‹ค๋…”๋”๋‹ˆ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.
    • ๋‘ ๋ฒˆ์งธ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ + ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๋“ค๊ณ  ๋‹ค๋‹ˆ๊ธฐ์˜€๋Š”๋ฐ ๋˜ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.
    • ๊ฒฐ๊ตญ ํ’€์ด ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ–ˆ๋‹ค. (ํ’€์ด ํฌ์ŠคํŒ…)
  • 75%์—์„œ 2๋ฒˆ ํ‹€๋ ธ๋Š”๋ฐ, ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ -1์ด ์ž˜ ์ฐํžˆ์ง€ ์•Š์•„์„œ ๊ทธ๋žฌ๋‹ค.
    • ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ -1์ด ์ž˜ ๋‚˜์™€์•ผํ•˜๋Š”๋ฐ, INF ๊ฐ’์„ Integer.MAX_VALUE๋กœ ๋‘๋ฉด overflow๊ฐ€ ๋‚˜์„œ ์ œ๋Œ€๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์•˜๋‹ค.
    • INF๋ฅผ ๋”ฐ๋กœ 2์–ต์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ๋ผ๊ณค ํ•˜์ง€๋งŒ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ ํ”„๋ฆผ์— ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๋ฉ”์„œ๋“œ ๋ช…์€ prim์œผ๋กœ ํ’€์ดํ–ˆ๋‹ค.
  • ์ƒ๊ฐ๋ณด๋‹ค ๋„ˆ๋ฌด ๊ณ ์ƒํ•ด์„œ ๋‹ค์ต์ŠคํŠธ๋ผ ์—ฐ์Šต์ด ๋” ํ•„์š”ํ•˜๋‹ค๊ณ  ์ ˆ์‹คํžˆ ๋Š๊ผˆ๋‹ค.

728x90

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

BOJ_1918 : ํ›„์œ„ ํ‘œ๊ธฐ์‹  (0) 2023.07.09
BOJ_1753 : ์ตœ๋‹จ๊ฒฝ๋กœ  (0) 2023.07.02
BOJ_1238 : ํŒŒํ‹ฐ  (0) 2023.06.27
BOJ_1167 : ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„  (0) 2023.06.25
BOJ_15663 : N๊ณผ M (9)  (0) 2023.06.11