득이공간

[백준 C++] 1068 트리 - 깊이우선탐색 본문

PS/알고리즘 문제풀이

[백준 C++] 1068 트리 - 깊이우선탐색

쟁득 2024. 4. 23. 19:23

 

1068번: 트리

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다

www.acmicpc.net


 

문제풀이

 

DFS 알고리즘 & List 자료구조를 이용해서 풀었습니다.

각 노드 마다 부모 노드를 배열에 저장해주고, 자식 노드는 리스트로 구성해주었습니다.

그리고 삭제 노드를 입력받았을 때 해당 노드의 부모의 자식 리스트에서 제거해주고

루트노드로부터 깊이 우선 탐색을 수행하도록 구현했습니다.


코드

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

int N, Root, Cnt;
int P[50];
list<int> C[50];

void DFS(int Node)
{
	if (C[Node].empty())
	{
		++Cnt;
		return;
	}

	for (const int& Child : C[Node])
	{
		DFS(Child);
	}
}

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

	cin >> N;
	for (int i = 0; i < N; ++i)
	{
		int Parent;
		cin >> Parent;
		P[i] = Parent;

		if (Parent == -1)
		{
			Root = i;
			continue;
		}

		C[Parent].emplace_back(i);
	}

	int D;
	cin >> D;
	if (D == Root)
	{
		cout << 0;
		return 0;
	}

	C[P[D]].erase(find(C[P[D]].begin(), C[P[D]].end(), D));

	DFS(Root);
	cout << Cnt;
}