kb84tkhrのブログ

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

GRL_5_A: Diameter of a Tree (続き)

ヒントが幅優先探索だったから幅優先で書いたけど
このレベルだと別に深さ優先でも同じだなあ

と思って深さ優先で書いてみたらリスト閉包で書けてずっと短くなった

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

    def rec(v):
        v.passed = True
        return max([0] + [rec(a) + w for a, w in v.adj
                          if not a.passed])

    return rec(s)

と言ってもACに近付いたというわけではない
少し遅くなったし

この形ならメモ化できるかな
といってもrec(v)をそのままメモ化することはできなさそうなので
少々無理して・・・

cache = {}

def furthest(T, s):

    def rec(v):
        v.passed = True
        fur = 0
        for a, w in v.adj:
            if not a.passed:
                if (v, a) in cache:
                    d = cache[(v, a)]
                else:
                    d = rec(a) + w
                    cache[(v, a)] = d
                fur = max(fur, d)
        return fur

    for v in T:
        v.passed = False
    return rec(s)

Case #23、#24は通過して#25(頂点数20000)でTLE
頂点数100000をクリアするには始点でループしてる場合じゃない気がしてきた