백준 11438 - LCA 2 (Python)
Updated:
전처리로 부모 관계를 정해준 뒤 푸는게 핵심입니다.
pypy3로 제출해야 합니다.
전체 코드
import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
LOG = 21
n = int(input())
parent = [[0] * LOG for _ in range(n + 1)]
visited = [0] * (n + 1)
distance = [0] * (n + 1)
graph = [[] for _ in range(n + 1)]
for _ in range(n - 1):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
def dfs(current, depth):
visited[current] = True
distance[current] = depth
for next in graph[current]:
if visited[next]:
continue
parent[next][0] = current
dfs(next, depth + 1)
def set_parent():
dfs(1, 0)
for i in range(1, LOG):
for j in range(1, n + 1):
parent[j][i] = parent[parent[j][i - 1]][i - 1]
def lca(a, b):
if distance[a] < distance[b]:
a, b = b, a
for i in range(LOG - 1, -1, -1):
if distance[a] - distance[b] >= 2**i:
a = parent[a][i]
if a == b:
return a
for i in range(LOG - 1, -1, -1):
if parent[a][i] != parent[b][i]:
a = parent[a][i]
b = parent[b][i]
return parent[a][0]
set_parent()
m = int(input())
for _ in range(m):
a, b = map(int, input().split())
print(lca(a, b))