import sys sys.setrecursionlimit(100000) def input(): return sys.stdin.readline() def dfs(node,d): visited[node] = False depth[node] = d for next_node in tree[node]: if not visited[next_node]: continue parents[next_node][0] = node dfs(next_node,d+1) def LCA(X,Y): if depth[X] != depth[Y]: if depth[X]>depth[Y]: X,Y = Y,X for i in range(MAX_NODE-1,-1,-1): if (depth[Y]-depth[X] >= (1<<i)): Y = parents[Y][i] if X == Y: return X if (Y != X): for i in range(MAX_NODE-1,-1,-1): if parents[X][i] != parents[Y][i]: X = parents[X][i] Y = parents[Y][i] return parents[X][0] N = int(input()) MAX_NODE = 17 tree = [[] for _ in range(N+1)] parents = [[0 for _ in range(MAX_NODE)] for _ in range(N+1)] depth = [0 for _ in range(N+1)] for i in range(N-1): x,y = map(int,input().split()) tree[y].append(x) tree[x].append(y) M = int(input()) visited = [True for _ in range(N+1)] dfs(1,0) for y in range(1,MAX_NODE): for x in range(1,N+1): parents[x][y] = parents[parents[x][y-1]][y-1] for _ in range(M): x,y = map(int,input().split()) print(LCA(x,y))
사과나무에서 썼던 LCA 공식을 그대로 가져와서 썼다.
여전히 잘 외워지지는 않는다.
나중에 LCA를 공부할때 다시 공부해서 이 유형을 다시 공부해야겠다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 1445 일요일 아침의 데이트 (0) | 2021.09.02 |
---|---|
[BOJ/백준] 16434 드래곤 앤 던전 (0) | 2021.07.31 |
[BOJ/백준] 3687 성냥개비 (0) | 2021.07.31 |
[BOJ/백준] 2613 숫자구슬 (0) | 2021.07.31 |
[BOJ/백준] 2307 도로검문 (0) | 2021.07.31 |