[백준] 트리의 부모 찾기 c++

2025. 1. 8. 11:47코딩테스트

트리의 부모 찾기 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 256 MB 97734 44364 31153 43.045%

문제

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

입력

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

출력

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


DFS를 이용해 문제를 해결한다

#include <iostream>
#include <vector>

using namespace std;

int N;
vector<int> answer;
vector<bool> visited;
vector<vector<int>> tree;

void DFS(int number) {
	visited[number] = true;

	// 현재 노드와 연결된 모든 노드에 대해 탐색
	for (int i : tree[number]) {
		if (false == visited[i]) {   // 아직 방문하지 않은 노드라면
			answer[i] = number;      // 해당 노드의 부모를 현재 노드로 설정
			DFS(i);                   // 해당 노드를 DFS로 탐색
		}
	}
}

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

	cin >> N;
	visited.resize(N + 1);
	answer.resize(N + 1);
	tree.resize(N + 1);

	// 트리 구조 입력 받기
	for (int i = 1; i < N; i++) {
		int n1, n2;
		cin >> n1 >> n2;
		tree[n1].push_back(n2);     // n1과 n2는 서로 연결되므로 양방향으로 저장
		tree[n2].push_back(n1);     // n2와 n1도 서로 연결되므로 양방향으로 저장
	}

	DFS(1);

	// 각 노드의 부모를 출력
	for (int i = 2; i <= N; i++) {
		cout << answer[i] << "\n";
	}

	return 0;
}

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

'코딩테스트' 카테고리의 다른 글

[백준] 문자열 집합 c++  (0) 2025.01.10
[백준] 트리 c++  (0) 2025.01.09
[백준] 불우이웃돕기 c++  (0) 2025.01.07
[백준] 다리 만들기2 c++  (0) 2025.01.06
[백준] 최소 스패닝 트리 c++  (0) 2025.01.05