문제📖
풀이🙏
- 첫 줄에 테스트 케이스의 개수 T가 주어진다.
- 각 테스트 케이스마다, 첫째 줄에 트리를 구성하는 노드의 수 N이 주어진다. (2 <= N <= 10000)
- N-1개의 줄에 트리를 구성하는 간선 정보가 주어집니다. 한 간선 당 한 줄에 두 개의 숫자 A B가 주어지는데, 이는 A가 B의 부모라는 뜻입니다.
- 테스트 케이스의 마지막 줄에 가장 가까운 공통 조상을 구할 두 노드가 주어진다.
- 각 테스트 케이스 별로, 첫 줄에 입력해서 주어진 두 노드의 가장 가까운 공통 조상을 출력하라.
-> LCA 알고리즘
문제이다.
-> lca 알고리즘을 이용하여 풀었지만 시간초과가 계속나서 아래 링크의 글을 참고하여 풀었다.
개발일기님 블로그
코드💻
import sys
T = int(sys.stdin.readline())
for _ in range(T):
N=int(sys.stdin.readline())
p_list=[0 for _ in range(N+1)]
for _ in range(N-1):
p,c=map(int,sys.stdin.readline().split())
p_list[c]=p
a,b=map(int,sys.stdin.readline().split())
a_parent=[a]
b_parent=[b]
while p_list[a]:
a_parent.append(p_list[a])
a=p_list[a]
while p_list[b]:
b_parent.append(p_list[b])
b=p_list[b]
a_level=len(a_parent)-1
b_level=len(b_parent)-1
while a_parent[a_level]==b_parent[b_level]:
a_level-=1
b_level-=1
print(a_parent[a_level+1])
결과😎
출처 && 깃허브📝
https://www.acmicpc.net/problem/3584
github