BOJ 1967 트리의 지름

접근 방법
우선 모든 노드에 대해 dijkstra나 bfs와 같은 거리 알고리즘을 적용하면 시간 초과가 날 것임을 볼 수 있다. 직관적으로 생각했을 때 트리의 지름을 구하는 것이므로 서로 제일 먼 두 끝 점을 구해야 한다. 그러기 위해서는 우선 루트 노드에 대해 dijkstra를 적용하여 root 노드에서 가장 먼 노드를 구했다.
여기서 root node에 대해 dijkstra를 적용하여 제일 먼 두 노드의 합으로 지름을 구할 수 있을 줄 알았는데 더 생각해보면 두 노드가 갈라져있지 않을 수도 있는 case가 존재한다는 것을 알 수 있다…
이어서 root 노드에서 가장 먼 노드로부터 가장 먼 노드까지의 거리를 구하면 된다. 이것이 바로 양 끝점 사이의 거리로 볼 수 있기 때문이다.
정답 코드
import sys
import heapq
input = sys.stdin.readline
"""
root 노드에서 모든 거리를 잰다
root 노드에서 가장 먼 노드는 지름의 한 끝이라고 볼 수 있다
그 노드에서 가장 먼 노드까지의 길이는 어떻게 보면 지름이라고 볼 수 있음
"""
n = int(input())
if n==1:
print(0)
else:
graph = [[] for _ in range(n+1)]
for _ in range(n-1):
a,b,c = map(int, input().split())
graph[a].append((b,c))
graph[b].append((a,c))
def dijkstra(start):
q = []
distances = [sys.maxsize]*(n+1)
visited = set()
distances[start] = 0
heapq.heappush(q, (0,start))
while q:
mid_cost, mid_node = heapq.heappop(q)
if mid_node in visited:
continue
visited.add(mid_node)
for end_node, cost in graph[mid_node]:
new_distance = distances[mid_node] + cost
if new_distance < distances[end_node]:
distances[end_node] = new_distance
heapq.heappush(q,(new_distance, end_node))
return distances
#가장 먼 노드 찾기
distances = dijkstra(1)
distances[0] = 0
max_d = 0
max_node = 0
for i in range(n+1):
if max_d < distances[i]:
max_d = distances[i]
max_node = i
distances = dijkstra(max_node)
distances[0] = 0
print(max(distances))
느낀 점
edge case에 대해 충분히 고민하는 습관이 필요한 것 같다.