kb84tkhrのブログ

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

GRL_5_A: Diameter of a Tree

関節点の問題はいっこうにやり方が降りてこないし
ここんとこどれもそんな感じなので
わからないものはいったん放置して先へ進むことに

今回は木の直径
まずは雑に端から端までの距離を全部求めていこう
この問題はそこから改良していけそうな気がする

class Node():
    def __init__(self, key):
        self.key = key
        self.indeg = 0
        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].indeg += 1
        T[t].indeg += 1
        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 = 0
    S = []
    S.append((s, 0))

    while S != []:
        v, vr = S.pop()
        v.passed = True
        is_end = True
        for a, w in v.adj:
            if not a.passed:
                S.append((a, vr + w))
                is_end = False
        if is_end:
            fur = max(fur, vr)

    return fur

def tree_diameter(T):
    r = 0
    for s in T:
        if s.indeg == 1:
            r = max(r, furthest(T, s))
    return r

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

if __name__ == "__main__":
    main()

Case #22 (頂点数1000)は0.50sで通過
Case #23 (頂点数5000)でTLE