결론부터 말하면 트리의 지름은 임의의 한 점에서 가장 멀리 떨어져 있는 점(A)과, 해당 점(A)에서 부터 가장 멀리 떨어진 점(B) 사이의 거리(AB)이다.
즉, 한 점(n)으로 부터 DFS(n)으로 가장 먼 점(A)을 구하고, 해당 점(A)에서 DFS(A)로 가장 먼 점(B)과의 거리가 된다.
이제부터 이 이유에 대해서 생각해보자.
트리의 특징 중 사이클이 존재하지 않는다. 즉, 지나간 노드는 다시 방문할 수 없다. 이것을 기억하자.
트리는 어떤 점을 기준으로 잡아도 트리가 된다. 예를 들어보자.
위와 같은 트리가 있다고 가정해보자.
만약 3번 노드를 잡고 위로 올려서 다른 노드들이 데롱데롱 매달리게 된다고 생각해보면 아래와 같은 그림이 된다.
어느 노드를 잡고 아래로 내리게 되든지 트리와 같은 모양이 된다.
"여기서 트리의 지름을 어떻게 구할까?"
간단히 생각해서 [예시2]를 봤을 때 노드 3을 기준으로 오른쪽(노드 6) 방향으로 가장 긴 선분과, 왼쪽(노드 1) 방향으로 가장 긴 선분의 두 길이를 더해주면 된다.
따라서 노드 3에서 가장 먼 노드를 찾아준다. 그러면 노드 4와 노드 5가 될 것이다. 그리고 해당 두 점, 노드 4와 노드 5에서 다시 가장 먼 노드를 찾아주면 6번을 찾을 것이다. 따라서 노드 4와 노드 6, 또는 노드 5와 노드 6을 잇는 길이가 트리의 지름이 될 것이다.
예시1에서도 똑같이 적용될 것이다.
1에서 가장 먼 점은 노드 4, 노드 5, 노드 6이 될 것이다. 해당 점에서 가장 먼 점을 다시 찾으면 노드 6, 노드 6, 노드 4(또는 노드 5)가 나올 것이다. 따라서 위의 방법은 어떤 경우에서든 트리의 최장 지름을 구할 수 있다.
'# Coding > # Algorithm' 카테고리의 다른 글
[보기 쉬운 Algorithm] 냅색(Knapsack) 알고리즘 - Python (0) | 2021.12.17 |
---|---|
[보기 쉬운 Algorithm] 깊이 우선 탐색(DFS) - Python (0) | 2021.03.19 |
[보기 쉬운 Algorithm] 너비 우선 탐색(BFS) - Python (0) | 2021.03.19 |
[보기 쉬운 Algorithm] 다익스트라(Dijkstra) 알고리즘 - Python (0) | 2021.03.18 |