개념
트리에서 가장 긴 경로
트리의 지름은 두 정점 사이의 거리 중 가장 큰 값입니다. 간선에 가중치가 있으면 경로에 있는 가중치의 합을 거리로 사용합니다.
가중치가 모두 이상인 트리에서는 두 번의 탐색으로 지름을 구할 수 있습니다.
- 임의의 정점에서 가장 먼 정점 를 구합니다.
- 에서 가장 먼 정점 를 구합니다.
- 와 사이의 거리가 지름입니다.
두 탐색의 역할
가중치가 모두 이고 간선이 인 트리를 보겠습니다. 에서 가장 먼 정점은 거리 인 입니다. 하지만 는 가장 긴 경로의 중간에 있으므로 이 거리 가 지름은 아닙니다. 에서 다시 탐색하면 과 까지 거리가 각각 이고, 이것이 지름입니다.
첫 탐색은 시작점을 지름의 끝점으로 옮기는 역할을 합니다. 두 번째 탐색은 그 끝점에서 반대쪽 끝점까지의 길이를 구합니다. 가장 먼 정점이 여러 개이면 그중 하나를 선택할 수 있습니다.
가중치가 있어도 두 정점 사이의 경로가 하나이므로 DFS나 BFS로 그 경로의 간선 비용을 더하면 거리가 정해집니다. 모든 정점을 시작점으로 탐색하면 정점 수만큼 탐색해야 하지만, 이 방법은 두 번으로 줄입니다.
첫 탐색으로 지름의 끝점을 찾는 이유
이미 가장 긴 경로 하나를 골랐다고 생각하고 그 양 끝을 라고 하겠습니다. 첫 탐색의 시작점은 , 에서 가장 먼 정점은 입니다. 두 정점 사이의 거리를 로 나타냅니다.
에서 경로 에 처음 닿는 점을 , 에서 처음 닿는 점을 라고 하겠습니다. 트리에는 사이클이 없으므로 각각의 갈래는 이 경로에 한 곳에서만 연결됩니다. 의 이름을 필요하면 서로 바꾸어 경로 위에서 순서가 되게 할 수 있습니다. 같은 위치인 점이 있어도 됩니다.
에서 까지는 를 지나갑니다. 는 보다 가깝지 않은 정점으로 골랐으므로 다음 관계가 성립합니다.
한편 에서 를 거쳐 로 가는 이동의 길이는 실제 경로의 길이 이상입니다. 갈래 일부를 되짚어 지나가는 경우가 있어도 가중치가 이상이기 때문입니다. 따라서 다음과 같습니다.
두 관계에서 공통 부분을 비교하면 입니다. 따라서 가장 긴 경로 의 마지막 부분 를 로 바꾸어도 길이가 줄지 않습니다. 원래 경로보다 더 긴 경로는 없으므로 도 지름이고, 를 지름의 끝점으로 사용할 수 있습니다.
복잡도
정점 수를 이라고 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 두 번의 탐색 | 그래프·재귀 |
예제
문제
간선에 길이가 있는 트리의 지름을 구하여라.
입력
첫째 줄에 정점 수 이 주어진다. 이다.
다음 개 줄에 간선의 양 끝점 와 길이 가 공백을 사이에 두고 주어진다. ; 이다.
출력
트리의 지름을 출력한다. 정점이 하나이면 을 출력한다.