• + 0 comments

    !/bin/python3

    simpelst one and solvable one i tried

    import math import os import random import re import sys sys.setrecursionlimit(10**6)

    def cutTheTree(data, edges): n = len(data) # adjacency (1-based nodes): convert to 0-based indices adj = [[] for _ in range(n)] for u, v in edges: u -= 1; v -= 1 adj[u].append(v) adj[v].append(u)

    total = sum(data)
    subtree = [0] * n
    visited = [False] * n
    
    def dfs(u, parent):
        s = data[u]
        for v in adj[u]:
            if v == parent:
                continue
            s += dfs(v, u)
        subtree[u] = s
        return s
    
    dfs(0, -1)  # root at node 0 (original node 1)
    
    ans = float('inf')
    for u in range(1, n):  # each node except root (consider cut between u and its parent)
        diff = abs(total - 2 * subtree[u])
        if diff < ans:
            ans = diff
    return ans
    

    if name == 'main': fptr = open(os.environ['OUTPUT_PATH'], 'w')

    n = int(input().strip())
    
    data = list(map(int, input().rstrip().split()))
    
    edges = []
    
    for _ in range(n - 1):
        edges.append(list(map(int, input().rstrip().split())))
    
    result = cutTheTree(data, edges)
    
    fptr.write(str(result) + '\n')
    
    fptr.close()