1068 트리
https://www.acmicpc.net/problem/1068
알고리즘
경우의 수를 나눠야한다
1. 지워지는 노드가 leaf 인 경우
지워지는 노드만 리프노드 카운트할 때 제외한다.
2. 지워지는 노드가 internal 인 경우
지워지는 노드 + 지워지는 노드의 자식노드까지 리프노드 카운트할 때 제외한다.
소스코드
1. 사용할 구조체와 전역변수 세팅
#include <iostream>
#include <vector>
using namespace std;
struct Node {
Node *parent;
int num;
vector<Node *> childs;
};
struct Root {
Node *rootNode;
};
vector<Node> v;
int ans = 0, m;
Root root;소스코드
2. 리프노드 탐색 함수
void traversal(int num) {
if (num == m) {
return;
}
int size = v[num].childs.size();
if (size == 0) {
++ans;
return;
}
if (size == 1) {
if (v[num].childs[0]->num == m) {
++ans;
return;
}
}
for (int i = 0; i < size; ++i) {
traversal(v[num].childs[i]->num);
}
}소스코드
3. 메인 함수
int main() {
int num;
scanf("%d", &num);
v.resize(num);
for (int i = 0; i < num; ++i) {
int parent;
scanf("%d", &parent);
v[i].num = i;
if (parent != -1) {
v[i].parent = &v[parent];
v[parent].childs.push_back(&v[i]);
} else {
v[i].parent = NULL;
root.rootNode = &v[i];
}
}
scanf("%d", &m);
traversal(root.rootNode->num);
printf("%d", ans);
return 0;
}1068 트리
By mingyun chae
1068 트리
- 379