Skip to content

Commit 1a12f8d

Browse files
committed
DFS / 잊지말자 트리에서도 DFS BFS
1 parent e2beec8 commit 1a12f8d

2 files changed

Lines changed: 105 additions & 0 deletions

File tree

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
2+
/* ************************************************************************** */
3+
/* */
4+
/* ::: ::: ::: */
5+
/* Problem Number: 15681 :+: :+: :+: */
6+
/* +:+ +:+ +:+ */
7+
/* By: thxogh1 <boj.kr/u/thxogh1> +#+ +#+ +#+ */
8+
/* +#+ +#+ +#+ */
9+
/* https://boj.kr/15681 #+# #+# #+# */
10+
/* Solved: 2025/05/05 19:14:42 by thxogh1 ### ### ##.kr */
11+
/* */
12+
/* ************************************************************************** */
13+
import java.io.BufferedReader;
14+
import java.io.InputStreamReader;
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
import java.util.StringTokenizer;
18+
19+
public class Main {
20+
static List<List<Integer>> li;
21+
static int[] ans;
22+
static boolean[] visited;
23+
24+
static int dfs(int node) {
25+
if (li.get(node).size() == 0) {
26+
ans[node] = 1;
27+
return 1;
28+
}
29+
if (visited[node]) {
30+
return 0;
31+
}
32+
visited[node] = true;
33+
int cnt = 0;
34+
for (int i = 0; i < li.get(node).size(); i++) {
35+
cnt += dfs(li.get(node).get(i));
36+
}
37+
ans[node] = cnt + 1;
38+
return cnt + 1;
39+
}
40+
41+
public static void main(String[] args) throws Exception {
42+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
43+
StringTokenizer st = new StringTokenizer(br.readLine());
44+
45+
int n = Integer.parseInt(st.nextToken());
46+
int r = Integer.parseInt(st.nextToken());
47+
int q = Integer.parseInt(st.nextToken());
48+
ans = new int[n + 1];
49+
li = new ArrayList<>();
50+
for (int i = 0; i < n + 1; i++) {
51+
li.add(new ArrayList<>());
52+
}
53+
for (int i = 0; i < n - 1; i++) {
54+
st = new StringTokenizer(br.readLine());
55+
int s = Integer.parseInt(st.nextToken());
56+
int e = Integer.parseInt(st.nextToken());
57+
li.get(s).add(e);
58+
li.get(e).add(s);
59+
}
60+
visited = new boolean[n + 1];
61+
dfs(r);
62+
for (int i = 0; i < q; i++) {
63+
System.out.println(ans[Integer.parseInt(br.readLine())]);
64+
}
65+
}
66+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# 15681번: 트리와 쿼리 - <img src="https://static.solved.ac/tier_small/11.svg" style="height:20px" /> Gold V
2+
3+
<!-- performance -->
4+
5+
<!-- 문제 제출 후 깃허브에 푸시를 했을 때 제출한 코드의 성능이 입력될 공간입니다.-->
6+
7+
<!-- end -->
8+
9+
## 문제
10+
11+
[문제 링크](https://boj.kr/15681)
12+
13+
<p>간선에 가중치와 방향성이 없는 임의의 루트 있는 트리가 주어졌을 때, 아래의 쿼리에 답해보도록 하자.</p>
14+
15+
<ul>
16+
<li>정점 U를 루트로 하는 서브트리에 속한 정점의 수를 출력한다.</li>
17+
</ul>
18+
19+
<p>만약 이 문제를 해결하는 데에 어려움이 있다면, 하단의 힌트에 첨부한 문서를 참고하자.</p>
20+
21+
## 입력
22+
23+
<p>트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 10<sup>5</sup>, 1 ≤ R ≤ N, 1 ≤ Q ≤ 10<sup>5</sup>)</p>
24+
25+
<p>이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한&nbsp;간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V)</p>
26+
27+
<p>이는 U와 V를 양 끝점으로 하는 간선이 트리에 속함을 의미한다.</p>
28+
29+
<p>이어 Q줄에 걸쳐, 문제에 설명한 U가 하나씩 주어진다. (1 ≤ U ≤ N)</p>
30+
31+
<p>입력으로 주어지는 트리는 항상 올바른 트리임이 보장된다.</p>
32+
33+
## 출력
34+
35+
<p>Q줄에 걸쳐 각 쿼리의 답을 정수 하나로 출력한다.</p>
36+
37+
## 소스코드
38+
39+
[소스코드 보기](Main.java)

0 commit comments

Comments
 (0)