結果

問題 No.1488 Max Score of the Tree
ユーザー LyricalMaestro
提出日時 2025-09-07 03:01:26
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 225 ms / 2,000 ms
コード長 1,512 bytes
コンパイル時間 317 ms
コンパイル使用メモリ 82,468 KB
実行使用メモリ 135,824 KB
最終ジャッジ日時 2025-09-07 03:01:31
合計ジャッジ時間 4,838 ms
ジャッジサーバーID
(参考情報)
judge / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 29
権限があれば一括ダウンロードができます

ソースコード

diff #

## https://yukicoder.me/problems/no/1488

import sys

sys.setrecursionlimit(10000)

def main():
    N, K = map(int, input().split())
    next_nodes = [[] for _ in range(N)]
    edges = []
    for i in range(N - 1):
        a, b, c = map(int, input().split())
        next_nodes[a - 1].append((b - 1, c, i))
        next_nodes[b - 1].append((a - 1, c, i))
        edges.append(c)


    def dfs(N, next_nodes, edges_weights, current_p, parent):
        child_num = 0
        for w, _, i in next_nodes[current_p]:
            if w ==parent:
                continue

            c_num = dfs(N ,next_nodes, edges_weights, w, current_p)
            edges_weights[i] = c_num
            child_num += c_num

        if len(next_nodes[current_p]) == 1:
            child_num += 1
        return child_num

    edges_weights = [-1] * (N - 1)
    dfs(N, next_nodes, edges_weights, 0, -1)

    tot_lengths = [-1] * (K + 1)
    tot_lengths[0] = 0
    for i in range(N - 1):
        new_tot_lengths = [-1] * (K + 1)
        for k in range(K + 1):
            if tot_lengths[k] >= 0:
                c = edges[i]
                c_num = edges_weights[i]

                new_tot_lengths[k] = max(new_tot_lengths[k], tot_lengths[k] + c * c_num)

                if k + c <= K:
                    new_tot_lengths[k + c] = max(new_tot_lengths[k + c], tot_lengths[k] + 2 * c * c_num)
        tot_lengths = new_tot_lengths
    
    print(max(tot_lengths))
                    

        






if __name__ == "__main__":
    main()
0