Skip to content

Commit dcd47fc

Browse files
committed
[Gold III] Title: LCA, Time: 1308 ms, Memory: 76072 KB -BaekjoonHub
1 parent fa507a3 commit dcd47fc

2 files changed

Lines changed: 97 additions & 0 deletions

File tree

백준/Gold/11437. LCA/LCA.swift

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
final class Queue<T> {
2+
private var queue = [T?]()
3+
private var head = 0
4+
var isEmpty: Bool {
5+
queue.count - head == 0
6+
}
7+
func enqueue(_ element: T) {
8+
queue.append(element)
9+
}
10+
func dequeue() -> T? {
11+
if isEmpty { return nil }
12+
let ret = queue[head]
13+
queue[head] = nil
14+
head += 1
15+
return ret
16+
}
17+
}
18+
19+
var answer = ""
20+
let n = Int(readLine()!)!
21+
var graph = [[Int]](repeating: [Int](), count: n+1)
22+
var parentInfo = [Int](repeating: 0, count: n+1)
23+
var depthInfo = [Int](repeating: 0, count: n+1)
24+
25+
(0..<n-1).forEach { _ in
26+
let ab = readLine()!.split { $0 == " " }.map { Int(String($0))! }
27+
graph[ab[0]].append(ab[1])
28+
graph[ab[1]].append(ab[0])
29+
}
30+
31+
var startNode = 1
32+
var queue = Queue<(Int, Int)>()
33+
queue.enqueue((startNode, 0))
34+
while !queue.isEmpty {
35+
let (curNode, depth) = queue.dequeue()!
36+
let childNodes = graph[curNode]
37+
childNodes.forEach {
38+
guard parentInfo[$0] == 0 && $0 != 1 else { return }
39+
parentInfo[$0] = curNode
40+
depthInfo[$0] = (depth+1)
41+
queue.enqueue(($0, depth+1))
42+
}
43+
}
44+
let m = Int(readLine()!)!
45+
(0..<m).forEach { _ in
46+
let vg = readLine()!.split { $0 == " " }.map { Int(String($0))! }
47+
// v의 depth가 g보다 반드시 큼
48+
var v = vg[0]
49+
var g = vg[1]
50+
if depthInfo[v] < depthInfo[g] { swap(&v, &g) }
51+
52+
while depthInfo[v] > depthInfo[g] {
53+
v = parentInfo[v]
54+
}
55+
56+
if v == g {
57+
answer.write("\(v)\n")
58+
return
59+
}
60+
61+
while parentInfo[v] != parentInfo[g] {
62+
v = parentInfo[v]
63+
g = parentInfo[g]
64+
}
65+
answer.write("\(parentInfo[v])\n")
66+
}
67+
print(answer)

백준/Gold/11437. LCA/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# [Gold III] LCA - 11437
2+
3+
[문제 링크](https://www.acmicpc.net/problem/11437)
4+
5+
### 성능 요약
6+
7+
메모리: 76072 KB, 시간: 1308 ms
8+
9+
### 분류
10+
11+
그래프 이론, 최소 공통 조상, 트리
12+
13+
### 제출 일자
14+
15+
2025년 3월 22일 22:51:41
16+
17+
### 문제 설명
18+
19+
<p>N(2 ≤ N ≤ 50,000)개의 정점으로 이루어진 트리가 주어진다. 트리의 각 정점은 1번부터 N번까지 번호가 매겨져 있으며, 루트는 1번이다.</p>
20+
21+
<p>두 노드의 쌍 M(1 ≤ M ≤ 10,000)개가 주어졌을 때, 두 노드의 가장 가까운 공통 조상이 몇 번인지 출력한다.</p>
22+
23+
### 입력
24+
25+
<p>첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정점 쌍이 주어진다.</p>
26+
27+
### 출력
28+
29+
<p>M개의 줄에 차례대로 입력받은 두 정점의 가장 가까운 공통 조상을 출력한다.</p>
30+

0 commit comments

Comments
 (0)