File tree Expand file tree Collapse file tree 1 file changed +46
-0
lines changed
Expand file tree Collapse file tree 1 file changed +46
-0
lines changed Original file line number Diff line number Diff line change 1+ import sys
2+ sys .setrecursionlimit (int (1e5 )) # 런타임 오류를 피하기 위한 재귀 깊이 제한 설정
3+
4+ n = int (input ())
5+
6+ parent = [0 ] * (n + 1 ) # 부모 노드 정보
7+ d = [0 ] * (n + 1 ) # 각 노드까지의 깊이
8+ c = [0 ] * (n + 1 ) # 각 노드의 깊이가 계산되었는지 여부
9+ graph = [[] for _ in range (n + 1 )] # 그래프(graph) 정보
10+
11+ for _ in range (n - 1 ):
12+ a , b = map (int , input ().split ())
13+ graph [a ].append (b )
14+ graph [b ].append (a )
15+
16+ # 루트 노드부터 시작하여 깊이(depth)를 구하는 함수
17+ def dfs (x , depth ):
18+ c [x ] = True
19+ d [x ] = depth
20+ for y in graph [x ]:
21+ if c [y ]: # 이미 깊이를 구했다면 넘기기
22+ continue
23+ parent [y ] = x
24+ dfs (y , depth + 1 )
25+
26+ # A와 B의 최소 공통 조상을 찾는 함수
27+ def lca (a , b ):
28+ # 먼저 깊이(depth)가 동일하도록
29+ while d [a ] != d [b ]:
30+ if d [a ] > d [b ]:
31+ a = parent [a ]
32+ else :
33+ b = parent [b ]
34+ # 노드가 같아지도록
35+ while a != b :
36+ a = parent [a ]
37+ b = parent [b ]
38+ return a
39+
40+ dfs (1 , 0 ) # 루트 노드는 1번 노드
41+
42+ m = int (input ())
43+
44+ for i in range (m ):
45+ a , b = map (int , input ().split ())
46+ print (lca (a , b ))
You can’t perform that action at this time.
0 commit comments