๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

SW/๋ฐฑ์ค€

[๋ฐฑ์ค€] 11725๋ฒˆ ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ ์ฐพ๊ธฐ (C++)

 

 

๋ชฉ์ฐจ

0. ์„œ๋ก 

1. ๋ฌธ์ œ ๋ฐฉํ–ฅ

2. ์ฝ”๋“œ

 

0. ์„œ๋ก 


๋ฌธ์ œ

๋ฃจํŠธ ์—†๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ฅผ 1์ด๋ผ๊ณ  ์ •ํ–ˆ์„ ๋•Œ, ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N (2 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N-1๊ฐœ์˜ ์ค„์— ํŠธ๋ฆฌ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋œ ๋‘ ์ •์ ์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ N-1๊ฐœ์˜ ์ค„์— ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ 2๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.


๊นŒ์ง€๊ฐ€ ๋ฌธ์ œ๋‹ค.

ํ•„์ž๊ฐ€ ํ‘ธ๋Š” ์‹œ์ ์—์„œ๋Š” ์‹ค๋ฒ„2์˜€๊ณ , ์ฒ˜์Œ์— ๊ฐ€๋‹ฅ์„ ์ž˜๋ชป ์งš์–ด ์กฐ๊ธˆ ํ—ค๋ฉ”์—ˆ๋‹ค.

 

1. ๋ฌธ์ œ ๋ฐฉํ–ฅ

 ํ•„์ž์˜ ์ƒ๊ฐ ํ๋ฆ„์ด ๊ถ๊ธˆํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์•„๋ž˜์˜ ๊บพ์–ด์ง„๊ตฌ๋ถ„์„  ์•„๋ž˜๋ถ€ํ„ฐ ๋ณด๋ฉด ๋œ๋‹ค.

ํ•„์ž๋Š” ์ฒ˜์Œ์— union find์™€ ๊ฒฝ๋กœ์••์ถ•์˜ ๋ณ€ํ˜•๋ฒ„์ „์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , 

for(int i = 0; i < N-1; ++i) {
	cin >> a >> b;
    table[a].push_back(b);
    table[b].push_back(a);
}

์ฒ˜๋Ÿผ ์ž…๋ ฅ ๋ฐ›๊ณ , ํ•˜๋‚˜ํ•˜๋‚˜ ์ˆœํšŒํ•˜๋ฉฐ vector์— ๋ถ€๋ชจ๋ฅผ ์ฐพ์•„ ๋„ฃ์—ˆ๋‹ค.

์žฌ๊ท€๋ฅผ ๋Œ๋ฉด์„œ 1์„ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ๊ณผ์ •์—์„œ ๋ฐœ๊ฒฌํ•œ ๋ฒˆํ˜ธ๋“ค์€ ์ด๋ฏธ ๋ถ€๋ชจ๋ฅผ ์ฐพ์•˜๊ณ , ๋ถ€๋ชจ๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ๋ถ€๋ชจ๋ฅผ ์ฐพ์€ ๋…ธ๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ๊ณผ์ •์€ 1๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๊ธฐ์— ๊ทธ๋ƒฅ ๋ถ€๋ชจ๋กœ ๊ฐ–๋‹ค ๋„ฃ์—ˆ๋‹ค.

 

์ด๋žฌ๋”๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. N์ด ๋ฌด๋ ค 10๋งŒ๊ฐœ๊นŒ์ง€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋“ฏ ํ•˜๋‹ค.


๊ทธ๋ž˜์„œ ์ด ๋ฌธ์ œ์˜ ๋ฐฉํ–ฅ์€, ํŠน์ • ์ˆ˜ ๋ถ€ํ„ฐ๊ฐ€ ์•„๋‹Œ, 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.

1๊ณผ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ˆซ์ž๋Š” 1์ด ๋ถ€๋ชจ๋‹ค.

1์˜ ์ž์‹์˜ ์ž์‹์€, 1์˜ ์ž์‹์„ ๋ถ€๋ชจ๋กœ ๋‘”๋‹ค.

 

-> ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, DFS BFS๊ฐ™์€ ํƒ์ƒ‰์ด ๋– ์˜ค๋ฅธ๋‹ค.

 

 

์ด๋Ÿฐ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

 

1๋กœ ์‹œ์ž‘ํ•œ ๊ฒฝ์šฐ, ๊ทธ ์ž์‹์ธ 2์™€ 3์€ 1์„ ๋ถ€๋ชจ๋กœ ๋‘๋ฉฐ, ๋ฐฐ์—ด์— ์ด๋ฅผ ์ €์žฅํ•œ๋‹ค.

์ด์ œ, ๊ทธ ๋‹ค์Œ ์ˆ˜์ธ 2๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜๋ฉด,

2์˜ ํƒ์ƒ‰ ๋Œ€์ƒ์€ 1, 4, 5๊ฐ€ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ, 2์˜ ๋ถ€๋ชจ์ธ 1์„ ๊ฑด๋“ค๊ฒŒ ๋˜๋ฉด ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๊ฑธ๋ฆฌ๊ธฐ์—, ์ด๋ฅผ ์ œ๊ฑฐํ•ด์„œ 4,5๋ฅผ ๋ด์•ผ ํ•œ๋‹ค.

 

์•„๋ž˜ ๊ธฐ์ˆ ํ•  ํ•„์ž์˜ ์ฝ”๋“œ๋Š” dfs์˜ ์žฌ๊ท€ ์ฝ”๋“œ์—์„œ "๊ทธ ์ „ ๊ฐ’"์„ ํ™•์ธํ•˜์—ฌ ๊ทธ๋ƒฅ ๋„˜๊ธฐ๋„๋ก ํ–ˆ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ• ์™ธ์—๋„ visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋„๋ก ํ•ด๋„ ๋œ๋‹ค. 

 

์—ฌ๋‹ด์œผ๋กœ ๋งํ•˜์ž๋ฉด, visited ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š”๊ฒƒ์ด ์•ฝ 10%์ •๋„ ๋น ๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๋“ฏ ํ•˜๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๋ถ€๋ชจ๊ฐ€ ์ฐพ์•„์ง„๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€๋ฉด ์ •๋‹ต์ด ๋‚˜์˜จ๋‹ค.

 

2. ์ฝ”๋“œ

 

#include <iostream>
#include <vector>
using namespace std;

int N;
vector<vector<int>> table;
vector<int> parents;

void init() {
    int a,b;
    cin >> N;

    table.resize(N+1);
    parents.resize(N+1, 0);

    for(int i = 0; i < N-1; ++i) {
        cin >> a >> b;
        table[a].push_back(b);
        table[b].push_back(a);
    }
}

void dfs(const int start, const int bef) {
    for(int target : table[start]) {
        if(target == bef) continue;
        parents[target] = start;
        dfs(target, start);
    }
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    init();
    dfs(1,0);

    for(int i = 2; i <= N; ++i) {
        cout << parents[i] << '\n';
    }

    return 0;
}