끄적끄적 코딩
article thumbnail
Published 2019. 9. 26. 12:39
[C++] 백준 1068번 트리 알고리즘

트리에서 하나의 노드를 지웠을 때 루트노드의 개수를 구하는 문제입니다.
노드를 지웠을때 그 노드의 자식노드도 같이 지워집니다.

2차원 벡터 2개를 생성했습니다.
vector<vector<int> > p 부모 노드값 저장    ex) p[i][0] i의 0번째 부모
vector<vector<int> > c 자식 노드값 저장    ex) c[i][0] i의 0번째 자식

지우려는 노드의 부모 노드로 가서
연결된 자식노드(삭제하려는 노드)를 지워줍니다.
연결선이 끊겼으므로, 삭제된 노드의 자식노드와의 연결도 끊기게 됩니다.

그리고 최상위 노드에서 DFS를 통해서 리프노드들을 탐색해서 개수를 출력해줍니다.

 

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

int n;
int num;
int del;
int start;
vector<vector<int> > p;
vector<vector<int> > c;

int DFS(int a)
{
	int count = 0;

	if (c[a].size() == 0) {
		return 1;
	}

	for (int i = 0; i < c[a].size(); ++i) {
		count += DFS(c[a][i]);
	}

	return count;
}

int main(int argc, char *argv[]) 
{
	cin >> n;

	p.resize(n);
	c.resize(n);
	
	for (int i = 0; i < n; ++i) {
		cin >> num;
		
		if (num == -1) {
			start = i;
			continue;
		}

		p[i].push_back(num);
		c[num].push_back(i);
	}

	cin >> del;

	if (p[del].size() == 0) {
		cout << "0" << endl;
		return 0;
	}

	int parent = p[del][0];
	for (int i = 0; i < c[parent].size(); ++i) {
		if (c[parent][i] == del) {
			c[parent].erase(c[parent].begin() + i);
			break;
		}
	}

	cout << DFS(start) << endl;
	
	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 1773번 폭죽쇼  (0) 2019.09.26
[C++] 백준 5567번 결혼식  (0) 2019.09.26
[C++] 백준 4963번 섬의 개수  (0) 2019.09.26
[C++] 백준 1120번 문자열  (0) 2019.09.26
[C++] 백준 2875번 대회 or 인턴  (0) 2019.09.26

검색 태그