문제링크 : https://www.acmicpc.net/problem/25516
25516번: 거리가 k이하인 트리 노드에서 사과 수확하기
n개의 정점과 n - 1개의 간선으로 구성된 트리 T가 있다. 정점 번호는 0부터 n - 1까지이고 0번 정점이 루트이다. 모든 간선의 길이는 1이다. 트리 T의 각 정점에는 사과가 0개 또는 1개 놓여있다. 루
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, p, c, result;
vector<int>v[100001];
int arr[100001];
void dfs(int node, int dist)
{
if(dist>K) return;
result+=arr[node]; //사과 더해주기
for(int i=0; i<v[node].size(); i++)
{
dfs(v[node][i], dist+1); //다음값 및 거리 증가
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
for(int i=0; i<N-1; i++)
{
cin >> p >> c;
v[p].push_back(c);
}
for(int i=0; i<N; i++)
{
cin >> arr[i];
}
dfs(0, 0);
cout << result;
}
간단한 dfs 및 bfs로 풀 수 있는 문제이다.
dfs 탐색시 현재 진행한 거리도 같이 넘겨준다. (K 체크)
그리고 다음 위치로 이동할때마다 해당 위치에 있는 사과를 더해주고, 현재 거리가 K를 넘겼으면 더해준 사과를 출력해주면 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 15900번] 나무 탈출 (C++) (0) | 2023.11.10 |
---|---|
[백준 14495번] 피보나치 비스무리한 수열 (C++) (0) | 2023.11.05 |
[백준 13116번] 30번 (C++) (0) | 2023.11.01 |
[백준 25511번] 값이 k인 트리 노드의 깊이 (C++) (0) | 2023.10.28 |
[백준 9372번] 상근이의 여행 (C++) (0) | 2023.10.27 |