매일 BOJ

(매일 BOJ) C++ 11725번 트리의 부모 찾기

norepinephrine 2025. 8. 27. 16:08

이번 문제는 트리의 부모 찾기이다

문제 요약

정점 1을 루트(root) 로 하는 트리가 주어진다. 각 간선은 무방향이며, 정점 수는 N, 간선 수는 N-1
목표는 정점 2부터 N까지 각각의 부모 정점을 출력하는 것이다

 

접근법

트리는 연결되어 있고 사이클이 없다

 루트(1)에서 한 번 BFS(또는 DFS) 를 돌면서 “처음 방문”한 정점의 부모를 누가 찍었는지 기록하면 끝

  • 시작: 1을 큐에 넣고 시작
  • 인접 정점 v를 처음 만났다면 parent[v] = u
  • 큐가 빌 때까지 반복 → parent[2..N] 출력

시간 복잡도는 인접 리스트 기준으로 O(N)이다

 

작성코드

아래 코드는 BFS로 부모를 구한다. 입력 이후 인접 리스트를 정렬해(선택 사항) 작은 번호부터 탐색하도록 했다

#include <bits/stdc++.h>
using namespace std;

void BFS (vector<int> & perent, vector<vector<int>> & vertex);
int N;

int main (void){
    ios::sync_with_stdio(false); cin.tie(0);
    cin >> N;
    
    vector<vector<int>> vertex(N+1);
    for(int i = 1; i < N; i++){
        int a,b;
        cin >> a >> b;
        vertex[a].push_back(b);
        vertex[b].push_back(a);
    }

    for(int i = 1; i <= N; i++){
        sort(vertex[i].begin(),vertex[i].end());
    }

    vector<int> perent(N+1,-1);
    BFS(perent,vertex);

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

    return 0;

}

void BFS (vector<int> & perent, vector<vector<int>> & vertex){
    queue<int> q;
    q.push(1);
    vector<bool> visited(N+1,false);
    visited[1] = true;

    while(!q.empty()){
        int current = q.front();
        q.pop();

        for(int next : vertex[current]){
            if(!visited[next] && perent[next] == -1){
                perent[next] = current;
                q.push(next);
            }
        }

    }

}