Coding Is My Life

코딩은 인생

그래프 이론/BFS, DFS 알고리즘

[백준]- 트리(1068번) c++

산기대 컴공 2020. 10. 17. 20:20
728x90

https://www.acmicpc.net/problem/1068

 

1068번: 트리

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

www.acmicpc.net

풀이

1.루트노드르르 찾는다.

2.벡터를 이용해서 트리를 만들어준다.

3.dfs를 이용해서 탐색을 한다

3-1. 자식 노드가 0개, 1개, 2개이상일때의 경우를 나눈다음 구현한다.

 

코드

#include <iostream>
#include <stdio.h>
#include <vector>
#include <cstring>
#define max 52
using namespace std;
vector <int> tree[max];
int visit[max]  = {0,};
int root[max];
int del;
int start;
int N,result = 0,dis = 0;
void dfs(int node){
    visit[node] = 1;
    if(node == del)
        return;
    int next_node;
    int child_size = tree[node].size();
    if(child_size == 0){
        result++;
    }
    else if(child_size == 1 && tree[node][0] == del){
        result++;
    }
    else{
        for(int i = 0;i<tree[node].size();i++){
            dfs(tree[node][i]);
        }
    }
}
int main(void){
    cin >> N;
    for(int i = 0;i<N;i++){
        int a;
        cin >> a;
        root[i] = a;
        if(a != -1){
            tree[a].push_back(i);
            //cout << a << " " << i <<"\n";
        }
        else{
            start = i;
        }
    }
    cin >> del;
    dfs(start);
    cout << result;
}

728x90