Files
Algorithm/백준/11438_re.py
2026-04-11 11:56:54 +09:00

80 lines
1.7 KiB
Python

import sys
from collections import deque
input = sys.stdin.readline
print = sys.stdout.write
N = int(input())
tree = [[0] for i in range(N+1)]
for _ in range(N-1):
s, e = map(int, input().split())
tree[s].append(e)
tree[e].append(s)
depth = [0] * (N+1)
visited = [False] * (N+1)
temp = 1
kmax = 0
while temp <= N:
temp <<= 1
kmax += 1
parent = [[0 for j in range(N+1)] for i in range(kmax + 1)]
def BFS(node):
queue = deque()
queue.append(node)
visited[node] = True
level = 1
now_size = 1
count = 0
while queue:
now_node = queue.popleft()
for neighbor in tree[now_node]:
if not visited[neighbor]:
visited[neighbor] = True
queue.append(neighbor)
parent[0][neighbor] = now_node
depth[neighbor] = level
count += 1
if (count == now_size):
count = 0
now_size = len(queue)
level += 1
BFS(1)
for k in range(1, kmax+1):
for n in range(1, N+1):
parent[k][n] = parent[k-1][parent[k-1][n]]
def executeLCA(a,b):
if depth[a] > depth[b]:
temp = a
a = b
b = temp
for k in range(kmax, -1, -1):
if pow(2, k) <= depth[b] - depth[a]:
if depth[a] <= depth[parent[k][b]]:
b = parent[k][b]
for k in range(kmax, -1, -1):
if a==b: break
if parent[k][a] != parent[k][b]:
a= parent[k][a]
b=parent[k][b]
LCA = a
if a!=b:
LCA = parent[0][LCA]
return LCA
M = int(input())
for _ in range(M):
a, b = map(int, input().split())
print(str(executeLCA(a,b)))
print("\n")