๊ธฐ๋ก๋ฐฉ

BOJ_1922 : ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1922 : ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ

Soom_1n 2024. 4. 30. 19:58

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



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

  • N๊ฐœ์˜ ์ปดํ“จํ„ฐ ์‚ฌ์ด M๊ฐœ์˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ์žˆ๋‹ค.
  • ๋ชจ๋“  ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•œ๋‹ค.

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

  • ์ „ํ˜•์ ์ธ MST ๋ฌธ์ œ์ด๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ์€ ์—ฐ๊ฒฐํ•˜๋ฉฐ ์ตœ์†Œ ๋น„์šฉ์ด ๋˜๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์—ฌ๊ธฐ์„œ๋Š” ํฌ๋ฃจ์Šค์นผ(Kruskal) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

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

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

public class Main {
    private static int[] parent;

    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 = null;

        int N = Integer.parseInt(br.readLine()); // ์ปดํ“จํ„ฐ ์ˆ˜
        int M = Integer.parseInt(br.readLine()); // ์—ฐ๊ฒฐ์„  ์ˆ˜
        parent = new int[N + 1];

        for (int i = 1; i <= N; i++) {
            parent[i] = i;
        }

        PriorityQueue<Network> pq = new PriorityQueue<>();

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            pq.add(new Network(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
        }

        // Kruskal
        int sum = 0;
        while (!pq.isEmpty()) {
            Network n = pq.poll();
            if (union(n.start, n.end)) {
                sum += n.cost;
            }
        }

        // Output
        bw.write(Integer.toString(sum));
        bw.flush();
    }

    private static int find(int a) {
        if (parent[a] == a) {
            return a;
        }
        return parent[a] = find(parent[a]);
    }

    private static boolean union(int a, int b) {
        a = find(a);
        b = find(b);
        if (a == b) {
            return false;
        }
        parent[a] = b;
        return true;
    }

    private static class Network implements Comparable<Network> {
        int start, end, cost;

        public Network(int start, int end, int cost) {
            this.start = start;
            this.end = end;
            this.cost = cost;
        }

        @Override
        public int compareTo(Network o) {
            return this.cost - o.cost;
        }
    }
}

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

  • ๋น„์šฉ์ด ๋‚ฎ์€ ๋„คํŠธ์›Œํฌ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์—ฐ๊ฒฐํ•ด๋ณด๋ฉฐ, ์„œํด์ด ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ™์€ ์ง‘ํ•ฉ์€ ๋ฐฐ์ œํ–ˆ๋‹ค.
  • ์—ฐ๊ฒฐ ๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ๋„คํŠธ์›Œํฌ ๋น„์šฉ์„ ๋ˆ„์ ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์ฒ˜์Œ์— MST์ธ ๊ฒƒ์€ ์•Œ์•˜์ง€๋งŒ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ๊ณ ๋ฅด๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฒ”ํ–ˆ๋‹ค.
    • ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ๋ฐ˜๋“œ์‹œ MST๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
    • ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ 1๋ถ€ํ„ฐ n๊นŒ์ง€ ํ•œ ๋ฒˆ์”ฉ ๋Œ์•„๊ฐ€๋ฉด์„œ ๋Œ๋ ค์„œ ๊ฐ€์ค‘์น˜ ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์˜ˆ์ œ๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ, ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.
  • MST ๊ด€๋ จ ์ด๋ก ์ด ์•„์ง ๋ถ€์‹คํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๊ณต๋ถ€๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค.
728x90