devonnuri.wiki

트리의 지름

입력 2025-04-05 08:16:24

수정 2025-04-05 08:16:24

TOC

  1. 트리의 지름
    1. 지름 구하는 방법
    2. 트리 = 지름의 간선 + 포레스트
    3. 각 정점에서 가장 먼 정점
    4. 가 지름이라는 증명
    5. 관찰
  2. 지름의 활용
  3. 참고 문헌

트리의 지름

가중치가 없는 트리에서, 는 정점 a에서 b까지의 단순 경로에 있는 간선의 개수로 정의한다. 트리에서 두 정점 간의 단순 경로는 유일하므로 는 함수로서 잘 정의된다. 트리의 지름diameter를 모든 정점 쌍에 대해 최대화하는 경로 를 말한다. 지름이 여러 개일 경우 그 중 하나만 골라도 된다.

음이 아닌 가중치가 있는 트리에도 이 정의가 적용된다. 이때 는 단순 경로 위 간선들의 가중치의 합이다.

지름 구하는 방법

정점이 개 있는 트리에서 지름을 찾는 간단한 방법은 다음과 같다.

  1. 아무 정점 에서 DFS를 수행한다.
  2. 그 결과 가장 멀리 있는 정점을 라고 한다.
  3. 다시 정점 에서 DFS를 수행한다.
  4. 이 DFS에서 가장 멀리 있는 정점을 라고 한다.
  5. 이때 경로 는 지름입니다.

트리 = 지름의 간선 + 포레스트

위 알고리즘을 증명하기에 앞서, 트리의 구조를 분석해 보자. (지름을 언급하긴 하지만, 가 실제 지름이라는 사실은 아직 증명하지 않는다.)

a tree

예를 들어, 정점 에서 DFS를 시작해 가장 먼 정점을 , 그리고 그로부터 가장 먼 정점을 이라 하자.

이제 지름 경로를 선형으로 표현하고, 지름 경로의 간선을 제거한다고 상상하면 여러 개의 트리로 구성된 포레스트forest가 된다. 각 트리를 지름 경로 위에 있는 정점 중 하나를 루트로 하여 구성해 보자. 이때 각 요소의 높이, 즉 루트로부터 가장 먼 정점까지의 거리는 얼마일까?

정점 가 포함된 요소의 루트를 라고 하고, 구간에 있는 어떤 요소의 루트를 , 그 안의 정점을 라고 하자.

에서 가장 먼 정점이 임을 이용하면 다음이 성립한다.

즉, 지름의 왼쪽 절반에 있는 요소()는 그 루트가 에서 떨어진 거리보다 큰 높이를 가질 수 없다.

같은 방식으로, 오른쪽 절반()에 대해서도 로부터 가장 멀다는 사실을 이용해 동일한 주장을 할 수 있다.

각 정점에서 가장 먼 정점

각 정점 에 대해, 가 최대가 되는 정점 를 찾아보자.

주장

는 항상 중 하나이다.

증명
  • 만약 다른 요소에 속해 있다면, 다음이 성립한다. (일반성을 잃지 않고, 보다 에 더 가깝다고 가정하자.)

따라서 도 같은 요소에 속해있다.

  • 만약 같은 요소에 속해 있다면, 다음이 성립한다.

역시 도 같은 요소에 속해 있다.

가 지름이라는 증명

이제 가 실제로 지름임을 증명해보자.

임의의 지름 가 존재한다고 가정하자. 그러면 다음 중 하나가 성립한다.

일반성을 잃지 않고 라고 가정하면,

따라서 도 지름이다.

관찰

이 알고리즘은 양의 가중치를 가진 트리에도 적용 가능하다. (여태껏 우린 가중치가 1이라는 사실을 이용한 적이 없다.) 하지만, 일반적인 그래프에서는 적용할 수 없다.

지름의 활용

a colored tree

대부분의 경우, 다음 두 가지를 반복적으로 사용하면 문제를 단순한 형태로 줄일 수 있다.

  1. 모든 정점에서 가장 먼 정점은 지름의 양 끝 중 하나이다.
  2. 각 서브트리(요소)의 높이는 해당 루트가 지름의 가까운 끝에서 떨어진 거리보다 작거나 같다.

지름 를 구했다면, 이제 트리 내의 임의의 경로를 고려해야 할 수 있습니다. 경로는 두 가지로 나뉩니다:

  • 지름과 교차하는 경로 (예: 파란색)
  • 지름과 교차하지 않는 경로 (예: 초록색)

이제 문제의 조건에 따라, 해당 경로를 어떻게 더 길게 만들지 또는 더 “최적화된” 경로로 만들지 고민해봐야 합니다. 예를 들어 다음과 같은 조건을 사용할 수 있다.

참고 문헌

  1. TheScrasse. “[Tutorial] Diameter of a tree and its applications”. Codeforces blog.