💻코딩테스트/백준

[백준/C++] 11725번 : 트리의 부모 찾기 (DFS/BFS 연습)

공대 컴린이 2023. 10. 11. 10:34
728x90

트리의 부모 찾기 

문제

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

입력

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

출력

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

예제 입력 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

주어진 입력이 트리의 부모노드와 자식노드로 따로 구분되어있지 않기 때문에, 양방향 그래프를 작성해주었다.

 

예제 입력이 위와 같이 주어졌을 때, 

1과 6을 입력받으면 tree[1] = 6, tree[6] = 1을 각각 초기화하여 양방향 그래프로 만들었다.

 

이후엔 DFS 또는 BFS를 활용하여 부모노드를 찾으면 되는데 나는 DFS(깊이 우선 탐색) 방법을 사용하였다.

 

#include <iostream>
#include <string>
#include <vector>

using namespace std;
vector<vector<int>> tree;
int parent[100001];

void DFS(int node)
{
	for(int i = 0; i < tree[node].size(); i++)
	{
		int next = tree[node][i];
		if(parent[next] == 0)
		{
			parent[next] = node;
			DFS(next);
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	int N;
	cin >> N;
	tree.resize(N+1);
	for (int i = 0; i < N-1; i++)
	{
		int temp1, temp2;
		cin >> temp1 >> temp2;
		tree[temp1].emplace_back(temp2);
		tree[temp2].emplace_back(temp1);
	}

	DFS(1);	

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

	return 0;
}

 

문제에서 루트노드를 1으로 둔다고 했기 때문에, 노드 1부터 DFS 탐색을 시작하였다.

 

트리의[node] 에 존재하는 원소를 for문으로 탐색하면서, 다음 노드가 존재하는데 부모 노드 배열(parent[100001])이 초기화되어 있지 않다면, 현재 노드를 부모로 설정하고 다음 노드를 또 DFS 탐색하도록 하였다.

 

문제 자체는 매우 간단한 DFS 문제였지만, 트리 노드들의 입력 값을 받아 양방향 그래프로 작성하고 부모를 찾아가는 방식이 인상깊어서 게시글로 정리해보았다.


https://www.acmicpc.net/problem/11725

 

11725번: 트리의 부모 찾기

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

www.acmicpc.net

 

728x90