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


코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static List<Integer> tree[];
static boolean visited[];
static int N, R, Q, dp[];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 트리의 정점의 수 (2 ~ 10^5)
R = Integer.parseInt(st.nextToken()); // 루트의 번호 (1 ~ N)
Q = Integer.parseInt(st.nextToken()); // 쿼리의 수 (1 ~ 10^5)
tree = new List[N + 1];
visited = new boolean[N + 1];
dp = new int[N + 1];
Arrays.fill(dp, 1); // 각 정점을 루트로하는 서브트리에 속한 정점의 수 1로 초기화
for (int i = 1; i <= N; i++) {
tree[i] = new ArrayList<>();
}
for (int i = 0; i < N - 1; i++) {
st = new StringTokenizer(br.readLine()); // 트리에 속한 간선의 정보
int U = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
tree[U].add(V);
tree[V].add(U);
}
dfs(R);
for (int i = 0; i < Q; i++) {
int U = Integer.parseInt(br.readLine());
sb.append(dp[U]).append("\n");
}
System.out.print(sb);
}
// DFS
static int dfs(int cur) {
visited[cur] = true;
for (int next : tree[cur]) {
if (!visited[next]) {
dp[cur] += dfs(next);
}
}
return dp[cur];
}
}
728x90
'알고리즘 > 트리' 카테고리의 다른 글
[백준][JAVA] 9934번 완전 이진 트리 (0) | 2024.01.17 |
---|---|
[백준][JAVA] 11438번 LCA 2 (1) | 2023.12.29 |
[백준][JAVA] 11437번 LCA (1) | 2023.12.28 |
[백준][JAVA] 3584번 가장 가까운 공통 조상 (1) | 2023.12.23 |
[백준][JAVA] 1991번 트리 순회 (1) | 2023.12.18 |