도구스개발

무거운 경로 분해(HLD) 계산기

트리를 무거운 간선으로 이어 몇 개의 체인으로 쪼개고, 두 정점 사이의 경로가 어느 체인 조각들로 나뉘는지 보여 줍니다. 가벼운 간선을 탈 때마다 서브트리가 반 이하로 준다는 것을 실제로 재어 O(log n)임을 확인할 수 있습니다.

v번째 값이 v의 부모입니다. 뿌리는 −1. 정점 2000개까지

15번에서 22번까지의 경로

체인 4조각

경로 위 정점은 7개, 최소 공통 조상은 1번입니다. 완전탐색으로 구한 경로와 같습니다.

경로가 나뉜 조각

#체인 머리배열 구간정점
10[1, 4]1 → 3 → 7 → 15
24[9, 9]4
310[13, 13]10
422[15, 15]22

조각마다 배열의 «연속 구간»이라는 것이 요점입니다. 그래서 세그먼트 트리를 얹으면 조각 하나를 O(log n)에 답할 수 있고, 조각이 O(log n)개라 전체가 O(log² n)이 됩니다.

이 트리의 모습

정점 수31개
체인 수16개
가장 긴 체인5개 정점
트리 높이4
이번 경로의 조각 수4개
뿌리까지 가벼운 간선 (최대)4개
log₂ n4.95
가벼운 간선이 log₂n 이하인가그렇습니다

만들어진 체인

머리길이정점 (위 → 아래)
050 → 1 → 3 → 7 → 15
16116
828 → 17
18118
434 → 9 → 19
20120
10210 → 21
22122
242 → 5 → 11 → 23
24124
12212 → 25
26126
636 → 13 → 27
28128
14214 → 29
30130

정점마다

v부모서브트리무거운 자식체인 머리배열 위치
0뿌리31100
1015301
20155216
317702
417949
52711217
62713624
7331503
8331786
94319410
1043211013
115323218
1253251221
136327625
1463291428
1571없음04
1671없음165
1781없음87
1881없음188
1991없음411
2091없음2012
21101없음1014
22101없음2215
23111없음219
24111없음2420
25121없음1222
26121없음2623
27131없음626
28131없음2827
29141없음1429

30개 정점만 보여 드립니다.

규칙은 한 줄뿐입니다. 각 정점에서 서브트리가 가장 큰 자식으로 가는 간선 하나만 «무겁다»고 부르고 나머지는 «가볍다»고 부릅니다. 정점마다 무거운 간선이 많아야 하나이므로 이어 붙이면 갈래가 지지 않는 곧은 줄이 됩니다.
O(log n)인 이유도 한 줄입니다. 가벼운 간선을 탈 때마다 서브트리 크기가 반 이하로 줄기 때문입니다 — 아니라면 그 자식이 가장 큰 자식이 되어 무거운 간선이었을 것입니다. 크기가 n에서 1까지 반씩 주는 데 log₂n번이면 되고, 체인이 바뀌는 것은 가벼운 간선을 탈 때뿐이라 조각 수도 그만큼입니다.
이것만으로는 경로 질의가 끝나지 않습니다. HLD는 «경로를 배열의 연속 구간 몇 개로 바꿔 주는» 일만 합니다. 그 구간의 합이나 최댓값을 실제로 구하려면 세그먼트 트리를 얹어야 하고, 그러면 전체가 O(log² n)이 됩니다. 최소 공통 조상은 HLD가 덤으로 줍니다.
어떤 트리냐에 따라 조각 수가 크게 다릅니다. 한 줄로 늘어선 트리는 통째로 체인 하나라 어떤 경로도 조각이 하나이고, 별 모양이면 잎에서 잎으로 갈 때 셋입니다. 갈래가 고르게 지는 균형 트리에서 log n에 가까워집니다 — 위 예제를 바꿔 가며 재어 보십시오.

사용 방법

  1. 1부모 배열을 넣습니다. "-1 0 0 1 1 2"는 0이 뿌리이고 1·2가 그 자식이라는 뜻입니다.
  2. 2예제에서 한 줄 트리·별 모양·무작위 트리를 골라 볼 수도 있습니다.
  3. 3각 정점의 서브트리 크기와 무거운 자식, 그리고 만들어진 체인 목록이 나옵니다.
  4. 4두 정점을 고르면 그 경로가 어느 체인 조각으로 나뉘는지 표로 나옵니다.
  5. 5가벼운 간선 수와 조각 수를 log₂n과 견주어 O(log n)인 것을 확인합니다.

자주 묻는 질문

각 정점에서 서브트리가 가장 큰 자식으로 가는 간선 하나만 «무겁다»고 부르고 나머지는 모두 «가볍다»고 부릅니다. 정점마다 무거운 간선이 많아야 하나이므로 무거운 간선들을 이어 붙이면 갈래가 지지 않는 곧은 줄, 곧 체인이 됩니다.

가벼운 간선을 탈 때마다 서브트리 크기가 반 이하로 줄기 때문입니다. 정점 v의 자식 c로 가는 간선이 가볍다면 c는 가장 큰 자식이 아니므로 size(c) ≤ size(v)/2입니다. 크기가 n에서 1까지 반씩 주는 데 log₂n번이면 되니 가벼운 간선은 그만큼뿐이고, 체인이 바뀌는 것은 가벼운 간선을 탈 때뿐이라 조각 수도 그만큼입니다.

아닙니다. HLD는 «경로를 배열의 연속 구간 몇 개로 바꿔 주는» 일만 합니다. 그 구간의 합이나 최댓값을 실제로 구하려면 세그먼트 트리나 펜윅 트리를 얹어야 하고, 조각이 O(log n)개에 각 조각이 O(log n)이라 전체가 O(log² n)이 됩니다. LCA는 HLD가 덤으로 줍니다.

균형 잡힌 트리에서 많아집니다. 한 줄로 늘어선 트리는 통째로 체인 하나라 어떤 경로도 조각이 하나이고, 별 모양이면 잎에서 잎으로 갈 때 셋입니다. 이진 균형 트리처럼 갈래가 고르게 지는 경우에 log n에 가까워지며, 이 계산기로 정점 수를 늘려 가며 재어 보실 수 있습니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서만 이뤄지고, 입력값은 이 기기의 저장소에만 남습니다.

알아두면 좋은 점

  • 정점 2000개까지 다룹니다. 설명을 위해 체인과 경로를 모두 펼쳐 들고 있기 때문입니다.
  • 분해와 질의만 합니다. 체인 위에 얹는 세그먼트 트리는 다루지 않습니다.
  • 간선에 값이 붙는 경우(edge query)는 정점에 값이 붙는 경우와 달리 LCA를 한 칸 건너뛰어야 합니다. 여기서는 정점 기준으로만 보여 줍니다.
  • 무작위 트리 수십 개·질의 수천 개에서 경로를 완전탐색으로 구한 값과 대조했고, 가벼운 간선 수가 log₂n을 넘지 않는 것도 확인했습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.