[백준] [C++] 트리 (tree)
2021. 5. 18. 21:01ㆍ알고리즘/백준
1. 문제
2. 풀이
트리의 리프노드는 부모 노드말고 연결점이 없다.
따라서 처음 트리를 인접리스트 형태로 데이터를 받은 후
리프노드를 set에 담은 뒤
재귀적으로 제거하는 노드에 딸린것들을 모두 제거하고
제거하는 노드 중 리프 노드인것을 set 에 지워버리면
남은 리프 노드의 개수를 알아낼 수 있다.
(제거하는 노드의 부모가 리프 노드가 될 수 있으므로 예외처리 해줘야한다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <iostream> #include <vector> #include <utility> #include <set> using namespace std; void recursionDelete(vector<vector<int> >& tree, set<int>& leap, int d) { if(tree[d].empty()) { leap.erase(d); return; } for(int i = 0; i < tree[d].size(); i++) { recursionDelete(tree, leap, tree[d][i]); } tree[d].clear(); } int deleteTree(vector<vector<int> >& tree, int d) { set<int> leap; int size = tree.size(); for(int i = 1; i < size; i++) { if(tree[i].empty()) { leap.insert(i); } } recursionDelete(tree, leap, d+1); return leap.size(); } //tree => 0 is root int main() { int n = 0, d = 0, answer = 0; cin>>n; vector<int> parent(n, 0); vector<vector<int> > tree(n+1); for(int i = 0; i < n; i++) { cin>>parent[i]; tree[parent[i] + 1].push_back(i+1); } cin>>d; answer = deleteTree(tree, d); if(tree[parent[d]+1].size() == 1 && parent[d] != -1) { answer++; } cout<<answer<<"\n"; } | cs |
'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 11054번 가장 긴 바이토닉 부분 수열 (dp, lis) (0) | 2021.06.25 |
---|---|
[백준][c++] 9251번, 9252번 LCS 1~2 (최장 공통 부분 수열) (dp) (0) | 2021.06.23 |
[백준] [C++] 2482번 색상환 (dp) (0) | 2021.06.03 |
[백준] [C++] 양팔저울 (dp) (0) | 2021.06.02 |
[백준] [C++] 순열 (dfs, 순환) (0) | 2021.05.11 |