๊ธฐ๋ก๋ฐฉ

BOJ_1753 : ์ตœ๋‹จ๊ฒฝ๋กœ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1753 : ์ตœ๋‹จ๊ฒฝ๋กœ

Soom_1n 2023. 7. 2. 10:34

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

 

1753๋ฒˆ: ์ตœ๋‹จ๊ฒฝ๋กœ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) ๋ชจ๋“  ์ •์ ์—๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์‹œ์ž‘ ์ •์ ์˜ ๋ฒˆํ˜ธ K(1 ≤ K ≤ V)๊ฐ€

www.acmicpc.net



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

  • ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์‹œ์ž‘ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.
    • ์ •์ ์˜ ์ˆ˜ V, ๊ฐ„์„ ์˜ ์ˆ˜ E. ์‹œ์ž‘ ๋…ธ๋“œ K์™€ ์—ฐ๊ฒฐ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
    • ๊ฐ€์ค‘์น˜๋Š” 10 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ์˜ ๋ฐ˜๋ณต์ด๋‚˜ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘ ์ตœ์†Œ ๊ฐ€์ค‘์น˜ ๊ฐ„์„ ์„ ์„ ํƒํ•ด ํƒ์ƒ‰ํ•œ๋‹ค.
      (๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ„์„  ์ค‘ ์ตœ์†Œ ๊ฐ’์„ ์„ ํƒํ•˜๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋ณด์žฅ๋œ๋‹ค)
    • ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” ๋ฌดํ•œ๋Œ€(INF)์ด์ง€๋งŒ,  -1๋กœ ํ‘œ์‹œํ•œ๋‹ค.

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

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;
        int weight;

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

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

    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));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());

        int V = Integer.parseInt(st.nextToken());
        int E = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(br.readLine());

        ArrayList<Edge>[] adjlist = new ArrayList[V + 1];
        for (int i = 1; i <= V; i++) {
            adjlist[i] = new ArrayList<>();
        }

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

        // Prim
        int[] d = new int[V + 1];
        Arrays.fill(d, -1);

        PriorityQueue<Edge> pq = new PriorityQueue<>();
        pq.add(new Edge(K, 0));

        while (!pq.isEmpty()) {
            Edge now = pq.poll();
            if (d[now.node] >= 0) continue;

            d[now.node] = now.weight;

            for (Edge e : adjlist[now.node]) {
                if (d[e.node] == -1) {
                    pq.add(new Edge(e.node, e.weight + now.weight));
                }
            }
        }

        // Output
        for (int i = 1; i <= V; i++) {
            if (d[i] == -1) sb.append("INF");
            else sb.append(d[i]);
            sb.append('\n');
        }

        bw.write(sb.toString());
        bw.flush();
    }
}

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

  • ๊ฐ„์„  ์ •๋ณด์—์„œ ์—ฐ๊ฒฐ ๋…ธ๋“œ์™€ ๊ฐ€์ค‘์น˜๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค Edge๋ฅผ ์„ ์–ธํ•œ๋‹ค.
    • ๋ชฉ์ ์ง€ ๋…ธ๋“œ๋Š” node, ๊ฐ€์ค‘์น˜๋Š” weight๋กœ ์ €์žฅํ•œ๋‹ค. 
    • ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ , compareTo ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์„œ ๋Œ€์†Œ ๋น„๊ต๊ธฐ์ค€์„ weight๋กœ ์„ค์ •ํ•œ๋‹ค.
  • ๋…ธ๋“œ ์ˆ˜, ๊ฐ„์„  ์ˆ˜, ์‹œ์ž‘ ๋…ธ๋“œ, ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
  • ๊ฐ ๋…ธ๋“œ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•  intํ˜• ๋ฐฐ์—ด d๋ฅผ ์„ ์–ธํ•˜๊ณ  -1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • ์šฐ์„ ์ˆœ์œ„ ํ์— ์‹œ์ž‘ ๋…ธ๋“œ K๋ฅผ ๋„ฃ๊ณ , ๊ฐ€์ค‘์น˜๋Š” 0์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ํ์—์„œ Edge ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๊บผ๋‚ธ๋‹ค.
    • ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด (๊ฐ€์ค‘์น˜๊ฐ€ -1์ด ์•„๋‹ˆ๋ฉด) ๋‹ค์‹œ ๋ฝ‘๋Š”๋‹ค.
    • ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด, ํ˜„์žฌ ๊ฐ€์ค‘์น˜๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์ด๋ฏ€๋กœ ๋ฐฐ์—ด d์— ์ €์žฅํ•œ๋‹ค.
    • ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ€์ค‘์น˜ ์ •๋ณด๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋”ํ•œ๋‹ค.
  • ๋ฐฐ์—ด d๋ฅผ ํ•œ ์ค„์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.
    • -1์€ "INF"๋กœ ๋ฐ”๊ฟ” ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์‹œ์ž‘ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” ๋ฐ”๋กœ Prim์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ์ƒ๊ฐํ•ด ์‰ฝ๊ฒŒ ํ’€์ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • ๋ฐฑ์ค€์—์„œ๋Š” Prim์ด ๋”ฐ๋กœ ์—†์ด Dijkstra์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
    • ์‚ฌ์‹ค ๊ฑฐ์˜ ๊ฐ™์€ ๊ฐœ๋…์ด๋ผ ํฐ ์ฐจ์ด๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐ๊ฐํ•œ๋‹ค. ํ•˜์ง€๋งŒ, Prim์€ ์—ฐ์Šต์ด ๋งŽ์ด ๋๋Š”๋ฐ Dijkstra๋Š” ์•„์ง ์—ฐ์Šต์ด ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ํ™œ์šฉ ๋ฌธ์ œ์—์„œ ์–ด๋ ค์›€์ด ๋งŽ๋‹ค.
  • ๋ฌธ์ œ์˜ ๋ถ„์„๊ณผ ํ’€์ด ์ „๋žต์„ ์ ์–ด๊ฐ€๋ฉฐ ํ’€์ดํ–ˆ๋‹ค.

728x90

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

BOJ_2096 : ๋‚ด๋ ค๊ฐ€๊ธฐ  (0) 2023.08.03
BOJ_1918 : ํ›„์œ„ ํ‘œ๊ธฐ์‹  (0) 2023.07.09
BOJ_1504 : ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ  (0) 2023.06.28
BOJ_1238 : ํŒŒํ‹ฐ  (0) 2023.06.27
BOJ_1167 : ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„  (0) 2023.06.25