어흥

[백준 15681] 트리와 쿼리 (C++) 본문

알고리즘/백준

[백준 15681] 트리와 쿼리 (C++)

라이언납시오 2020. 6. 15. 21:04
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/15681

 

15681번: 트리와 쿼리

트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 105, 1 ≤ R ≤ N, 1 ≤ Q ≤ 105) 이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V) ��

www.acmicpc.net

1. 주의할 점

- DFS +DP를 이용하여 메모아이징을 사용해야 한다

 

2. 구현

- 모든 간선들의 정보를 V[] 배열에 담는다

- 입력 받은 Root를 기준으로 DFS()를 수행하며 메모아이징을 이용해서 해결한다. 또한, Visit[] 배열을 사용하여 해당 Node의 부모를 세지 않도록 한다

 

#include <iostream>
#include <vector>
using namespace std;
vector<int> v[100001];
bool visit[100001] = { false, };
int num[100001];
int node, query, s, e;

int dfs(int n) {
	if (num[n] != 0) return num[n];
	visit[n] = true;
	int ret = 1;
	for (int i = 0; i < v[n].size(); i++) {
		int next = v[n][i];
		if (visit[next]) continue;
		ret += dfs(next);
	}
	num[n] = ret;
	return ret;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int root;
	cin >> node >> root >> query;
	for (int i = 0; i < node - 1; i++) {
		cin >> s >> e;
		v[s].push_back(e);
		v[e].push_back(s);
	}
	num[root] = dfs(root);
	for (int i = 0; i < query; i++) {
		cin >> s;
		cout << num[s] << '\n';
	}
	return 0;
}
728x90
반응형
Comments