일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 세그먼트 트리
- NEXT
- dropout
- 알고리즘
- 가끔은 말로
- 문자열
- 분할 정복
- 이분 탐색
- DP
- 백트래킹
- tensorflow
- 회고록
- Overfitting
- back propagation
- 크루스칼
- 가끔은_말로
- pytorch
- dfs
- 자바스크립트
- 플로이드 와샬
- BFS
- 너비 우선 탐색
- 미래는_현재와_과거로
- 2023
- 우선 순위 큐
- c++
- object detection
- 조합론
- lazy propagation
- 다익스트라
Archives
- Today
- Total
Doby's Lab
백준 1068번: 트리 (C++) 본문
https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
Solved By: DFS
DFS를 선언하면서 자신이 Leaf Node인지 아닌지를 판단할 수 있는 코드가 필요했습니다. 어떤 노드의 parent 노드는 방문이 다 된 상태이기 때문에 현재 노드에서 방문할 노드가 생기면 이는 Leaf Node로 판단하게 했습니다.
방문할 노드가 있다는 것은 Child Node가 있다는 것이고 이는 Leaf Node가 아님을 뜻하기 때문입니다.
그리고, Root Node가 지워버리는 노드로 선정된다면 이는 예외처리로 보고 바로 0을 출력하게 해줬습니다.
#include <iostream>
#include <vector>
#define MAX 51
using namespace std;
vector<int> adj[MAX];
int n;
int ernode;
bool visited[MAX];
int cnt = 0;
void dfs(int cur){
visited[cur] = true;
bool flag = true; // leaf인가 아닌가
for(auto nxt : adj[cur]){
if(visited[nxt]) continue;
if(nxt == ernode) continue;
flag = false;
dfs(nxt);
}
if(flag) cnt++;
return;
}
int main(){
cin >> n;
int root;
for(int i = 0; i < n; i++){
int v; cin >> v;
if(v == -1){
root = i;
}
else{
adj[v].push_back(i);
}
}
cin >> ernode;
if(root == ernode) cout << 0;
else{
dfs(root); cout << cnt;
}
return 0;
}
'PS > BOJ' 카테고리의 다른 글
백준 17633번: 제곱수의 합 (More Huge) (C++) (0) | 2022.08.07 |
---|---|
백준 23832번: 서로소 그래프 (C++) (0) | 2022.08.07 |
백준 12037번: Polynesiaglot (Small1) (C++) (0) | 2022.08.06 |
백준 11525번: Farey Sequence Length (C++) (0) | 2022.08.06 |
백준 2533번: 사회망 서비스(SNS) (C++) (0) | 2022.08.06 |