Algorithm

[BOJ] 트리의 부모 찾기 11725번 C++

따봉치치 2024. 10. 7. 15:31
728x90

 

 

문제

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

 

출력

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

 

접근 방식

 

트리의 간선 정보를 이용해 부모-자식 간의 관계를 파악해야 한다.

이때, 루트를 1을 기준으로 했을 때를 주의할 것!

 

간단하게 DFS(깊이 우선 탐색)을 이용해 관계를 파악할 수 있는데

루트노드인 1을 기준으로 자식들을 탐색하면서 확인하면 된다.

이때, 1의 자식노드들을 탐색할 때, 4와 6이 연결되어 있다면

4와 6의 부모는 1이기 때문이 이를 부모 배열에 따로 저장해주면 된다!

 

 

코드

#include<bits/stdc++.h>
using namespace std;
int N;
vector<vector<int>> tree;
vector<int> parent;

void dfs(int node, int par) {
    parent[node] = par;

    for(int nxt : tree[node]) {
        if(nxt != par) {
            dfs(nxt, node);
        }
    }
}

int main() {
    cin>>N;
    tree.resize(N+1);
    parent.resize(N+1);

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

    dfs(1,0);

    for(int i=2; i<=N; i++) cout<<parent[i]<<'\n';
}
728x90