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)
0 commit comments