๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 15681๋ฒˆ - ํŠธ๋ฆฌ์™€ ์ฟผ๋ฆฌ

by ์•ˆ์ฃผํ˜• 2022. 9. 4.

๋ฌธ์ œ

 

15681๋ฒˆ: ํŠธ๋ฆฌ์™€ ์ฟผ๋ฆฌ

ํŠธ๋ฆฌ์˜ ์ •์ ์˜ ์ˆ˜ N๊ณผ ๋ฃจํŠธ์˜ ๋ฒˆํ˜ธ R, ์ฟผ๋ฆฌ์˜ ์ˆ˜ Q๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 105, 1 ≤ R ≤ N, 1 ≤ Q ≤ 105) ์ด์–ด N-1์ค„์— ๊ฑธ์ณ, U V์˜ ํ˜•ํƒœ๋กœ ํŠธ๋ฆฌ์— ์†ํ•œ ๊ฐ„์„ ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ U, V ≤ N, U ≠ V)

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#include <vector>

using namespace std;

int N, R, Q;
int max_depth = -1, max_node;
vector<int>graph[100001];
int subnode_cnt[100001];

int dfs(int node, int before){
    for(auto next: graph[node]){
        if(next != before){
            subnode_cnt[node] += dfs(next, node)+1;
        }
    }
    return subnode_cnt[node];
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>N>>R>>Q;
    for(int i=0; i<N-1; i++){
        int a,b; cin>>a>>b;
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    dfs(R, 0);
    
    for(int i=0; i<Q; i++){
        int q; cin>>q;
        cout<<subnode_cnt[q]+1<<'\n';
    }
}

 

ํ’€์ด

ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— dfs๋ฅผ ํ•œ๋ฒˆ๋งŒ ๋Œ์•„์„œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋กœ์ง์€  subnode_cnt[node] += dfs(next, node)+1;  ์ž…๋‹ˆ๋‹ค.

๋ฆฌํ”„ ๋…ธ๋“œ๊นŒ์ง€ ๋“ค์–ด๊ฐ„ ๋‹ค์Œ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ๋Œ์•„์˜ค๋ฉด์„œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ +1์”ฉ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•จ์œผ๋กœ์จ ๋‹จ ํ•œ๋ฒˆ์€ dfs๋งŒ์œผ๋กœ subnode์˜ ๊ฐฏ์ˆ˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€