📕알고리즘 문제/📝Baekjoon

[백준] 실버2 : (11725) 트리의 부모 찾기

주으기 2024. 12. 2. 20:32
728x90
반응형

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

 

각 정점의 부모를 찾는 문제이다.

 

노드들의 부모-자식 관계를 알 수 없으니, 그래프의 형태로 노드의 연결을 저장한다.

 

트리의 루트는 항상 1이다.

따라서 1의 자식 노드는 항상 부모 노드가 1이다.

1의 자식 노드를 n이라고 한다면, n의 자식 노드는 항상 부모 노드가 n이다.

 

이 과정은 트리의 루트부터 높이가 높아지며 BFS로 검사하는 것과 같다.

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int N;

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

	cin >> N;

	vector<int> Node(N + 1);			// 1...N 노드의 부모 노드
	vector<bool> Visit(N + 1);			// 방문(부모 찾기)한 노드
	vector<vector<int>> Tree(N + 1);	// 각 노드와 연결된 노드

	for (int i = 0, a, b; i < N - 1; ++i)
	{
		cin >> a >> b;

		Tree[a].push_back(b);
		Tree[b].push_back(a);
	}

	// 트리의 루트인 1부터 시작
	queue<int> q;
	q.push(1);
	Visit[1] = true;

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

		// 현재 검사중인 노드의 자식 노드를 검사
		for (int k = 0; k < Tree[n].size(); ++k)
		{
			int nn = Tree[n][k];
			if (Visit[nn]) continue;

			Visit[nn] = true;
			Node[nn] = n; // 발견한 자식 노드의 부모 노드는 현재 검사중인 노드이다.
			q.push(nn);
		}
	}

	for (int i = 2; i <= N; ++i)
		cout << Node[i] << "\n";
}

 

 

 

 

 

728x90
반응형