• + 0 comments
    #!/bin/python3
    
    import math
    import os
    import random
    import re
    import sys
    
    #
    # Complete the 'cutTheTree' function below.
    #
    # The function is expected to return an INTEGER.
    # The function accepts following parameters:
    #  1. INTEGER_ARRAY data
    #  2. 2D_INTEGER_ARRAY edges
    #
    sys.setrecursionlimit(10**7)
    
    class Vertex:
        def __init__(self, value):
            self.value = value
            self.edges = []
            self.is_init = False
        
        def add_edge(self, vertex):
            self.edges.append(vertex)
            
    def init(vertex, parent, sum_cache):
        vertex.is_init = True
        subtotal = vertex.value
        for adj in vertex.edges:
            if adj is not parent:
                subtree_sum = init(adj, vertex, sum_cache)
                sum_cache[(vertex, adj)] = subtree_sum
                sum_cache[(adj, vertex)] = sum_cache_total - subtree_sum
                subtotal += subtree_sum
        return subtotal
    
    def min_diff(vertices, sum_cache, total_sum):
        min_diff_value = total_sum
        for v in vertices:
            for adj in v.edges:
                diff = abs(total_sum - 2 * sum_cache[(v, adj)])
                if diff < min_diff_value:
                    min_diff_value = diff
        return min_diff_value
    
    N = int(sys.stdin.readline())
    values = list(map(int, sys.stdin.readline().split()))
    vertices = [Vertex(val) for val in values]
    for _ in range(N - 1):
        a, b = map(int, sys.stdin.readline().split())
        vertices[a - 1].add_edge(vertices[b - 1])
        vertices[b - 1].add_edge(vertices[a - 1])
    
    sum_cache = {}
    sum_cache_total = sum(values)
    init(vertices[0], None, sum_cache)
    result = min_diff(vertices, sum_cache, sum_cache_total)
    print(result)