Skip to content

Commit bd92ea1

Browse files
committed
Tree and query / 중급
1 parent e09fbed commit bd92ea1

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// https://www.acmicpc.net/problem/15681
2+
const filePath =
3+
process.platform === "linux"
4+
? "/dev/stdin"
5+
: require("path").join(__dirname, "input.txt")
6+
const input = require("fs").readFileSync(filePath).toString().trim().split("\n")
7+
const log = console.log
8+
9+
// 가중치, 방향 없는 트리
10+
// 정점 U를 루트로 하는 서브트리에 속한 정점 수 출력하기
11+
12+
// 방법 1: 문제에서 주어진 힌트 처럼, 자식 배열을 활용
13+
const [N, R, Q] = input[0].split(" ").map(Number)
14+
15+
const graph = Array.from({ length: N + 1 }, () => [])
16+
const query = Array(Q)
17+
const children = Array.from({ length: N + 1 }, () => [])
18+
const size = Array(N + 1).fill(1)
19+
20+
for (let i = 1; i <= N - 1; i++) {
21+
let [u, v] = input[i].split(" ").map(Number)
22+
graph[u].push(v)
23+
graph[v].push(u)
24+
}
25+
let idx = 0
26+
for (let i = N; i < N + Q; i++) {
27+
query[idx++] = +input[i]
28+
}
29+
30+
const makeTree = (cur, parent) => {
31+
for (let next of graph[cur]) {
32+
if (next !== parent) {
33+
children[cur].push(next)
34+
makeTree(next, cur)
35+
}
36+
}
37+
}
38+
39+
// 부모자식관계를 파악하기 위한 두 가지 방법
40+
// 1. 명시적으로 배열에 저장 -> makeTree 선행 필요
41+
const countSubtreeNodes = (cur) => {
42+
for (let next of children[cur]) {
43+
countSubtreeNodes(next)
44+
size[cur] += size[next]
45+
}
46+
}
47+
// 2. visited배열로 부모자식 파악
48+
const visited = Array(N + 1).fill(false)
49+
const countSubtreeNodes2 = (node) => {
50+
if (visited[node]) return size[node]
51+
visited[node] = true // 방문 표시로 부모-자식 관계 파악
52+
53+
for (const next of graph[node]) {
54+
if (!visited[next]) {
55+
// 방문하지 않은 노드는 자식
56+
size[node] += countSubtreeNodes2(next)
57+
}
58+
}
59+
return size[node]
60+
}
61+
/*
62+
makeTree(R, 0)
63+
countSubtreeNodes(R)
64+
log(children)
65+
*/
66+
countSubtreeNodes2(R)
67+
68+
for (let q of query) log(size[q])
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
9 5 3
2+
1 3
3+
4 3
4+
5 4
5+
5 6
6+
6 7
7+
2 3
8+
9 6
9+
6 8
10+
5
11+
4
12+
8

0 commit comments

Comments
 (0)