มีต้นไม้ n โหนด แต่ละโหนดมีค่า ตัดขอบหนึ่งขอบ ให้ความต่างของผลรวมค่าโหนดในสอง subtree น้อยที่สุด
ตัวอย่าง: n=6, edges=[[1,2],[1,3],[2,4],[3,5],[3,6]], values=[10,20,10,50,10,60] → 0
ขั้นตอนการแก้ปัญหา
- สร้าง adjacency list
- คำนวณผลรวม subtree ทุกโหนดด้วย DFS (post-order)
- สำหรับแต่ละขอบ (u,v) โดย v เป็นลูกของ u: ความต่าง = |total_sum - 2 * subtree_sum[v]|
- หาค่าต่ำสุด
ตัวอย่างโค้ด Python
def solve(n, edge_list, values):
adj = [[] for _ in range(n)]
for u, v in edge_list:
adj[u-1].append(v-1)
adj[v-1].append(u-1)
subtree = [0] * n
visited = [False] * n
def dfs(u):
visited[u] = True
s = values[u]
for v in adj[u]:
if not visited[v]:
s += dfs(v)
subtree[u] = s
return s
total = dfs(0)
ans = float('inf')
for u in range(n):
for v in adj[u]:
if subtree[v] < subtree[u]: # v is child
diff = abs(total - 2 * subtree[v])
if diff < ans:
ans = diff
return ans
# ทดสอบ
print(solve(6, [[1,2],[1,3],[2,4],[3,5],[3,6]], [10,20,10,50,10,60])) # ผลลัพธ์: 0
อินพุตตัวอย่าง
6, [[1, 2], [1, 3], [2, 4], [3, 5], [3, 6]], [10, 20, 10, 50, 10, 60]
เอาต์พุตตัวอย่าง
0