์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 11725 ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ ์ฐพ๊ธฐ

๐ŸŠ๊ทค๐ŸŠ 2024. 12. 21. 01:52

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/11725

  • ๋ฃจํŠธ ์—†๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ฅผ 1์ด๋ผ๊ณ  ์ •ํ–ˆ์„ ๋•Œ, ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
  • ์ฒซ์งธ ์ค„์— ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N (2 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N-1๊ฐœ์˜ ์ค„์— ํŠธ๋ฆฌ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋œ ๋‘ ์ •์ ์ด ์ฃผ์–ด์ง„๋‹ค.
  • ์ฒซ์งธ ์ค„๋ถ€ํ„ฐ N-1๊ฐœ์˜ ์ค„์— ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ 2๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์•„์ด๋””์–ด

  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํŠธ๋ฆฌ์˜ ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  DFS๋กœ ๋…ธ๋“œ๋งˆ๋‹ค ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์„œ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.
  • ์šฐ์„  ๋ฃจํŠธ๋ฅผ 1๋กœ ์ •ํ–ˆ์œผ๋ฏ€๋กœ, 1๋ถ€ํ„ฐ DFS๋ฅผ ๋Œ๋ฆฌ๋ฉฐ ๋…ธ๋“œ 1์„ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๊ณ , 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธ ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ผ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ 1๋กœ ์ €์žฅํ•˜๊ณ  (๋งŒ์•ฝ 1์— 2๋ผ๋Š” ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์—ˆ๋‹ค๋ฉด, parent[2] = 1์ด๋ผ ์ €์žฅ) ํ•ด๋‹น ๋…ธ๋“œ๋กœ DFS๋ฅผ ๋‹ค์‹œ ๋Œ๋ฆฐ๋‹ค.
  • ๋‹ค์Œ ๋…ธ๋“œ๋กœ DFS๋ฅผ ๋Œ๋ฆด ๋•Œ๋„, ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค ์ค‘ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ๋˜์–ด์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ๋ผ๋ฉด, ๊ทธ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ํ˜„์žฌ DFS๋ฅผ ๋Œ๋ฆฌ๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋กœ ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ DFS๋ฅผ ๋Œ๋ฆฌ๋ฉฐ ๋ฐ˜๋ณตํ•œ๋‹ค.

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • X

ํŠธ๋ฆฌ ๋ฌธ์ œ๋ผ์„œ ์–ด์ œ์ฒ˜๋Ÿผ ํด๋ž˜์Šค ๋งŒ๋“ค์–ด์„œ ํ’€ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€๋ ค์„œ ์ข‹์•˜๋‹ค..!! ์ข€ ๋” ํŠธ๋ฆฌ๋ฅผ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋‚ ๊นŒ์ง€...ํŒŒ์ดํŒ…!!

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class BOJ11725 {
    static int N;
    static ArrayList<Integer> tree[];
    static int parent[];
    static boolean visited[];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        N = Integer.parseInt(br.readLine());
        // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํŠธ๋ฆฌ ๊ตฌํ˜„
        tree = new ArrayList[N + 1];
        // ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด
        parent = new int[N + 1];
        // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited = new boolean[N + 1];

        // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
        for (int i = 1; i <= N; i++) {
            tree[i] = new ArrayList<>();
        }

        // ํŠธ๋ฆฌ์˜ ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
        for (int i = 0; i < N - 1; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            // ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ
            tree[a].add(b);
            tree[b].add(a);
        }

        // DFS๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ ์ •๋ณด ์ฐพ๊ธฐ (๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค ํ–ˆ์œผ๋ฏ€๋กœ)
        dfs(1);

        // 2๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ N๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€์˜ ๋ถ€๋ชจ ์ถœ๋ ฅ
        for (int i = 2; i <= N; i++) {
            sb.append(parent[i]).append("\n");
        }

        System.out.print(sb);
    }

    // ๋ถ€๋ชจ ๋…ธ๋“œ ์ฐพ๊ธฐ ์œ„ํ•œ DFS
    public static void dfs(int node) {
        // ํ˜„์žฌ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[node] = true;

        // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ์ž์‹ ๋…ธ๋“œ๋“ค ํ™•์ธ
        for (int child : tree[node]) {
            // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ผ๋ฉด
            if (!visited[child]) {
                // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋กœ ์ €์žฅ ํ›„
                parent[child] = node;
                // ์ž์‹ ๋…ธ๋“œ๋กœ ๋‹ค์‹œ DFS๋ฅผ ๋Œ๋ฆผ
                dfs(child);
            }
        }
    }
}