白駿1167号樹の直径


質問する



インプット



solution

import sys
from collections import deque

input = sys.stdin.readline
n = int(input())
arr = [[] for i in range(n + 1)]
res = 0


def dfs(idx, cost):
    global res
    for i, c in arr[idx]:
        if visited[i] == 0:
            visited[i] = cost + c
            dfs(i, c + cost)


for i in range(n):
    cur = list(map(int, input().split()))
    i = 1
    while 1:
        if cur[i] == -1:
            break
        arr[cur[0]].append((cur[i], cur[i + 1]))
        i += 2
visited = [0 for i in range(n + 1)]
dfs(1, 0)
visited[1] = 0
res = 0
idx = 0
for i in range(2, n + 1):
    if res < visited[i]:
        res = visited[i]
        idx = i
visited = [0 for i in range(n + 1)]
dfs(idx, 0)
visited[idx] = 0
print(max(visited))

説明:

  • 特定のノードを選択し、最も遠いノード(B)を検索します.
  • から見つかったノード(B)からdfsまでは,最も遠いノードの距離が木の直径となる.
  • このアルゴリズムの証明
    ツリーの直径証明
    木の直径を求める方法を知っていれば
    dfsを2回迂回すれば解決できる簡単な問題