반응형
https://www.acmicpc.net/problem/1167
import collections
n = int(input())
graph = collections.defaultdict(list)
for i in range(n):
row = list(map(int, input().split()))
start = row[0]
for j in range(1, len(row)-1, 2):
next, w = row[j], row[j+1]
graph[start].append([next, w])
global val
global max_node
val, max_node = 0, 0
def dfs(node, weight):
global val
global max_node
if val < weight:
val = weight
max_node = node
for next, w in graph[node]:
if not visited[next-1]:
visited[next-1] = True
dfs(next, weight + w)
visited = [False for _ in range(n)]
visited[0] = True
dfs(1, 0)
visited = [False for _ in range(n)]
visited[max_node-1] = True
dfs(max_node, 0)
print(val)
트리의 지름 구하는 공식을 알고 있으면 구현은 쉽지만, 그 공식을 모르면 풀기가 힘들다.
<트리의 지름 구하는 공식>
임의의 노드에서 거리가 가장 긴 노드를 구함(그럼 이 도착 노드가 트리의 지름을 구성하는 양 끝 노드 중 한 노드임)
이 노드에서 다시 거리가 가장 긴 노드를 구함. 이때의 거리가 트리의 지름이 된다.
댓글