728x90
๋ฌธ์
ํ์ด
๋ฐฑ์ค LCA ๋ฌธ์ ์ ๋์ผํ ์ค ์์๋๋ฐ ์๋์๋ค.
https://www.acmicpc.net/problem/11437
11437๋ฒ: LCA
์ฒซ์งธ ์ค์ ๋ ธ๋์ ๊ฐ์ N์ด ์ฃผ์ด์ง๊ณ , ๋ค์ N-1๊ฐ ์ค์๋ ํธ๋ฆฌ ์์์ ์ฐ๊ฒฐ๋ ๋ ์ ์ ์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์๊ณ ์ถ์ ์์ ๊ฐ์ M์ด ์ฃผ์ด์ง๊ณ , ๋ค์ M๊ฐ ์ค์๋ ์
www.acmicpc.net
์ฐจ์ด์ ์ LCA์ ๊ฒฝ์ฐ ์๋ฐฉํฅ ๊ฐ์ ์ผ๋ก ์ ๋ ฅ์ด ์ฃผ์ด์ง์ง๋ง, ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ๊ฒฝ์ฐ ๋จ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ์ด ์ฃผ์ด์ง๋ค.
๋ํ LCA๋ ๋ฃจํธ ๋ ธ๋๊ฐ 1๋ก ๊ณ ์ ๋์ง๋ง, ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ๊ฒฝ์ฐ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ง์ ๊ตฌํด์ผ ํ๋ค.
์ฝ๋
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
def dfs(x, depth):
visited[x] = True
d[x] = depth
for child in graph[x]:
if visited[child]: continue
dfs(child, depth + 1)
t = int(input())
for _ in range(t):
n = int(input())
graph = [[] for _ in range(n + 1)]
visited = [False] * (n + 1)
parent = [0] * (n + 1)
d = [0] * (n + 1)
for _ in range(n - 1):
a, b = map(int, input().split())
graph[a].append(b)
parent[b] = a
for i in range(1, n + 1):
if parent[i] == 0:
dfs(i, 0)
break
a, b = map(int, input().split())
while d[a] != d[b]:
if d[a] > d[b]:
a = parent[a]
else:
b = parent[b]
while a != b:
a = parent[a]
b = parent[b]
print(a)
๋ง๋ฌด๋ฆฌ
LCA๋ ์ด๋ ์ ๋ ๋ง์คํฐํ ๋ฏ ์ถ๋ค. ใ ใ
728x90