kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

GRL_5_A: Diameter of a Tree (続き3)

解説だ解説

行って帰るだけでいいんだよっていう説明があった
そうならざるを得ないことはわかった
そうなりそうだという感覚は残念ながらない

d(u, v)≧d(x, y)をわざわざ示してるところがあるけど
uvが直径なんだから仮定よりそうなります、じゃだめなのかなあ

しかも、最初に始める点はどこでもいいのか
若干図に騙された気がしないでもない
そういうとことか模範解答とか見ながらコードを整理

from collections import deque

class Node():
    def __init__(self, key):
        self.key = key
        self.passed = False
        self.adj = []

def read_inputs():
    n = int(input())
    T = [Node(i) for i in range(n)]
    for _ in range(n - 1):
        s, t, w = [int(x) for x in input().split()]
        T[s].adj.append((T[t], w))
        T[t].adj.append((T[s], w))
    return T

def furthest(T, s):
    for v in T:
        v.passed = False

    fur = -1
    fur_v = None
    Q = deque()
    Q.append((s, 0))

    while len(Q) > 0:
        v, vr = Q.popleft()
        if vr > fur:
            fur = vr
            fur_v = v
        v.passed = True
        for a, w in v.adj:
            if not a.passed:
                Q.append((a, vr + w))

    return fur, fur_v

def tree_diameter(T):
    _, s = furthest(T, T[0])
    fur, _ = furthest(T, s)
    return fur

def main():
    T = read_inputs()
    r = tree_diameter(T)
    print(r)

if __name__ == "__main__":
    main()

最大のやらかしは幅優先といいつつキューではなくてスタックを使ってたこと
前にもやったような気がする
結果は変わらないけど