일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백트래킹
- 알고리즘
- 2023
- Overfitting
- 조합론
- NEXT
- 가끔은 말로
- 자바스크립트
- 우선 순위 큐
- dfs
- 이분 탐색
- 크루스칼
- 분할 정복
- 회고록
- 다익스트라
- pytorch
- 문자열
- 가끔은_말로
- lazy propagation
- c++
- DP
- BFS
- tensorflow
- back propagation
- 세그먼트 트리
- 너비 우선 탐색
- object detection
- 플로이드 와샬
- dropout
- 미래는_현재와_과거로
Archives
- Today
- Total
Doby's Lab
백준 1068번: 트리 (C++) 본문
https://www.acmicpc.net/problem/1068
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;
}
728x90
'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 |