TOC
트리의 지름
가중치가 없는 트리에서,
음이 아닌 가중치가 있는 트리에도 이 정의가 적용된다. 이때
지름 구하는 방법
정점이
- 아무 정점
에서 DFS를 수행한다. - 그 결과 가장 멀리 있는 정점을
라고 한다. - 다시 정점
에서 DFS를 수행한다. - 이 DFS에서 가장 멀리 있는 정점을
라고 한다. - 이때 경로
는 지름입니다.
트리 = 지름의 간선 + 포레스트
위 알고리즘을 증명하기에 앞서, 트리의 구조를 분석해 보자. (지름을 언급하긴 하지만,
예를 들어, 정점
이제
정점
즉, 지름의 왼쪽 절반에 있는 요소(
같은 방식으로, 오른쪽 절반(
각 정점에서 가장 먼 정점
각 정점
- 만약
이 와 다른 요소에 속해 있다면, 다음이 성립한다. (일반성을 잃지 않고, 이 보다 에 더 가깝다고 가정하자.)
따라서
- 만약
가 와 같은 요소에 속해 있다면, 다음이 성립한다.
역시
가 지름이라는 증명
이제
임의의 지름
일반성을 잃지 않고
따라서
관찰
이 알고리즘은 양의 가중치를 가진 트리에도 적용 가능하다. (여태껏 우린 가중치가 1이라는 사실을 이용한 적이 없다.) 하지만, 일반적인 그래프에서는 적용할 수 없다.
지름의 활용
대부분의 경우, 다음 두 가지를 반복적으로 사용하면 문제를 단순한 형태로 줄일 수 있다.
- 모든 정점에서 가장 먼 정점은 지름의 양 끝 중 하나이다.
- 각 서브트리(요소)의 높이는 해당 루트가 지름의 가까운 끝에서 떨어진 거리보다 작거나 같다.
지름
- 지름과 교차하는 경로 (예: 파란색)
- 지름과 교차하지 않는 경로 (예: 초록색)
이제 문제의 조건에 따라, 해당 경로를 어떻게 더 길게 만들지 또는 더 “최적화된” 경로로 만들지 고민해봐야 합니다. 예를 들어 다음과 같은 조건을 사용할 수 있다.
참고 문헌
- TheScrasse. “[Tutorial] Diameter of a tree and its applications”. Codeforces blog.