結果

問題 No.872 All Tree Path
ユーザー AT274_AT274_
提出日時 2019-10-14 15:34:01
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 552 ms / 3,000 ms
コード長 1,356 bytes
コンパイル時間 170 ms
コンパイル使用メモリ 82,476 KB
実行使用メモリ 155,848 KB
最終ジャッジ日時 2024-06-06 10:44:51
合計ジャッジ時間 7,149 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 547 ms
155,756 KB
testcase_01 AC 551 ms
152,828 KB
testcase_02 AC 510 ms
144,036 KB
testcase_03 AC 306 ms
142,488 KB
testcase_04 AC 35 ms
53,292 KB
testcase_05 AC 527 ms
143,764 KB
testcase_06 AC 533 ms
155,848 KB
testcase_07 AC 552 ms
153,260 KB
testcase_08 AC 120 ms
82,096 KB
testcase_09 AC 122 ms
81,664 KB
testcase_10 AC 122 ms
82,100 KB
testcase_11 AC 122 ms
81,752 KB
testcase_12 AC 124 ms
82,048 KB
testcase_13 AC 37 ms
52,480 KB
testcase_14 AC 38 ms
52,000 KB
testcase_15 AC 38 ms
52,224 KB
testcase_16 AC 37 ms
52,224 KB
testcase_17 AC 38 ms
51,968 KB
testcase_18 AC 38 ms
52,224 KB
testcase_19 AC 39 ms
52,096 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

# nadare様のコード参考
# https://yukicoder.me/submissions/374115

N = int(input())
T = [[] for i in range(N)]
E = []
for i in range(N - 1):
    a, b, w = map(int, input().split())
    a, b = a - 1, b - 1
    T[a].append(b)
    T[b].append(a)
    E.append([a, b, w])


class TwoDividedTree:
    def __init__(self, n, tree):
        self.tree = tree
        self.depth = [-1] * n
        self.size = [1] * n

        self.calc()

    def calc(self):
        self.depth[0] = 0
        stack = [0]
        rev_directions = []  # 深いところから根に辿る辺の集合

        while stack:
            fr = stack.pop()
            for to in self.tree[fr]:
                if self.depth[to] != -1:
                    continue

                self.depth[to] = self.depth[fr] + 1
                stack.append(to)
                rev_directions.append([fr, to])

        while rev_directions:
            parent, child = rev_directions.pop()
            self.size[parent] += self.size[child]

    '''
    辺(a, b) で木を2分割した時の、片方のサイズ
    '''
    def size_after_divided(self, a, b):
        if self.depth[a] < self.depth[b]:
            a, b = b, a
        return self.size[a]


tdt = TwoDividedTree(N, T)
ans = 0
for a, b, w in E:
    s = tdt.size_after_divided(a, b)
    ans += 2 * s * (N - s) * w

print(ans)
0