동기: 경로와 서브트리를 동시에
Link-Cut Tree는 경로 질의에 강하지만 서브트리 합 같은 질의는 어색하다. 탑 트리(Top Tree) 는 트리를 클러스터(cluster) 계층으로 추상화해 경로·서브트리 질의를 한 틀에서 다룬다.
클러스터와 경계 정점
탑 트리의 단위는 클러스터: 원래 트리의 연결된 부분 그래프로, 외부와 닿는 경계 정점(boundary vertex) 이 최대 2개다.
- 베이스 클러스터: 원래 트리의 간선 하나.
- 두 클러스터를 합치는 두 연산:
- compress: 경계 정점을 공유하는 두 경로형 클러스터를, 그 중간 정점을 내부로 흡수 하며 합침.
- rake: 한 클러스터를 다른 클러스터의 경계에 매달아 흡수(서브트리 방향).
두 경계 = 두 손잡이
각 클러스터는 두 경계 정점 \((a, b)\)를 손잡이로 노출한다. compress는 \(a - m - b\)를 \(a - b\)로(중간 \(m\) 흡수), rake는 매다는 쪽 경계를 없앤다. 트리 전체는 결국 하나의 루트 클러스터로 수축된다.
이 수축 과정은 트리를 균형 잡힌 계층으로 만들어, \(O(\log n)\) 깊이를 보장한다(셀프-밸런싱: 무작위/병렬 수축 또는 LCT 위에 얹는 방식).
집계(aggregate)의 정의
클러스터마다 사용자 정의 정보를 둔다. 합치는 규칙을 두 가지로 준다.
merge_compress(L, R, m): 경로 정보 결합(예: 경로 합/최댓값, 중간 정점 \(m\)의 기여 포함).merge_rake(L, R): 서브트리 정보 결합(매달린 가지의 기여).
이 두 함수가 결합법칙을 만족하면 어떤 순서로 수축해도 같은 답이 나온다.
무엇을 풀 수 있나
| 질의/갱신 | 방법 |
|---|---|
| 경로 합/최댓값 | expose 후 루트 경로 클러스터 읽기 |
| 서브트리 합 | rake 누적 정보 |
| link / cut | 베이스 클러스터 추가/제거 후 재수축 |
| 정점 가중치 갱신 | 해당 베이스 클러스터부터 위로 갱신 |
| 무게중심/지름 | merge 함수에 거리쌍 정보 인코딩 |
expose 연산
특정 정점(또는 두 정점)을 루트 클러스터의 경계로 끌어올리는 expose가 핵심 인터페이스다. expose 후에는 원하는 경로/서브트리가 루트 클러스터의 집계로 즉시 읽힌다. 한 번의 expose는 \(O(\log n)\) 클러스터를 재구성한다.
복잡도
모든 연산(link, cut, expose, 질의)이 amortized 또는 worst-case \(O(\log n)\). 상수는 LCT보다 크지만, 경로·서브트리·트리 전역 질의를 동시에 지원하는 범용성이 강점이다.
다음 강의에서 LCT 위에 rake를 얹는 실전 설계와 예제 집계를 본다.