문제링크 : https://www.acmicpc.net/problem/25511
25511번: 값이 k인 트리 노드의 깊이
n개의 정점과 n - 1개의 간선으로 구성된 트리 T가 있다. 정점 번호는 0부터 n - 1까지이고 0번 정점이 루트이다. 간선에는 가중치가 없다. 트리 T에 있는 각 정점에는 서로 다른 값이 부여된다. 트리
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int N, K;
int arr[100001];
int parent[100001];
int dfs(int n, int cnt)
{
if(n==0) return cnt; //루트 도달
return dfs(parent[n], cnt+1); //루트찾기
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
for(int i=0; i<N-1; i++)
{
int p, c;
cin >> p >> c;
parent[c]=p;
}
int target = 0; //목표 정점 저장용
for(int i=0; i<N; i++)
{
cin >> arr[i];
if(arr[i]==K) target=i;
}
cout << dfs(target, 0);
}
목표 정점에 대해 따로 저장을 해두고, 해당 값을 기준으로 부모를 계속해서 찾아나가면 된다.
부모를 찾아나갈때마다 깊이를 1 증가시켜주고, 부모의 값이 루트인 0을 만나면 종료시켜주면 된다.
목표 정점을 따로 저장했어야 했는데 단순히 arr[K]값을 나타내는 건줄알고 이를 토대로 했다가 여러번 틀렸다..
<예제>
8 5
0 1
0 2
1 3
1 4
2 5
2 6
6 7
0 1 2 3 4 5 6 7
target : 5
parent[5] = 2, cnt + 1(1)
parnet[2] = 0, cnt + 1(2)
깊이 : 2
'백준 > 실버' 카테고리의 다른 글
[백준 25516번] 거리가 k이하인 트리 노드에서 사과 수확하기 (C++) (0) | 2023.11.03 |
---|---|
[백준 13116번] 30번 (C++) (0) | 2023.11.01 |
[백준 9372번] 상근이의 여행 (C++) (0) | 2023.10.27 |
[백준 1309번] 동물원 (C++) (0) | 2023.10.20 |
[백준 11057번] 오르막 수 (C++) (0) | 2023.10.13 |