Problem 11725 트리의 부모 찾기 문제 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력 첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력 첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
문제 링크 https://www.acmicpc.net/problem/11725
예제 입력 1 7 1 6 6 3 3 5 4 1 2 4 4 7
예제 출력 1 4 6 1 3 1 4
예제 입력 2 12 1 2 1 3 2 4 3 5 3 6 4 7 4 8 5 9 5 10 6 11 6 12
예제 출력 2 1 1 2 3 3 4 4 5 5 6 6
solve
트리의 부모를 구하는 문제이다.
트리의 루트를 1이라고 정해놨으므로 bfs탐색을 통해 시작점을 1로 지정한 후 탐색을 하면 된다.
bfs를 수행하며 다음 노드의 부모는 현재 노드이기 때문에 parent[next] = node 와 같이 기록한다.
탐색 후 2번 노드부터 출력한다.
코드 설명 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 #include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std ;const int MAX = 100000 ;vector <int > a[MAX + 1 ];bool check[MAX + 1 ];int parent[MAX + 1 ];int main (void ) { int n; cin >> n; for (int i = 0 ; i < n - 1 ; i++) { int u, v; cin >> u >> v; a[u].push_back(v); a[v].push_back(u); } queue <int > q; q.push(1 ); check[1 ] = true ; while (!q.empty()) { int node = q.front(); q.pop(); for (int i = 0 ; i < a[node].size (); i++) { int next = a[node][i]; if (check[next] == false ) { q.push(next); check[next] = true ; parent[next] = node; } } } for (int i = 2 ; i <= n; i++) { cout << parent[i] << '\n' ; } }