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