题目描述
蓝桥公司一共有 nn 名员工,编号分别为 1∼n1∼n。
他们之间的关系就像一棵以董事长为根的树,父节点就是子节点的直接上司。
每个员工有一个快乐指数 aiai。
现蓝桥董事会决定举办一场蓝桥舞会来让员工们在工作之余享受美好时光,不过对于每个员工,他们都不愿意与自己的直接上司一起参会。
董事会希望舞会的所有参会员工的快乐指数总和最大,请你求出这个最大值。
输入描述
输入的第一行是一个整数 nn,表示蓝桥公司的员工数。
第二行包含 nn 个整数,分别表示第 ii 个员工的快乐指数 aiai。
接下来 n−1n−1 行每行包含两个整数 u,vu,v,表示 vv 是 uu 的直接上司。
1≤u,v,ai≤n≤1051≤u,v,ai≤n≤105
输出描述
输出一个整数,表示答案。
输入输出样例
示例 1
输入
3
1 2 3
2 1
3 1
输出
5
import os
import sys
# 从输入中读取测试用例的数量
n = int(input())
# 从输入中读取n个整数,这些整数存储在一个列表a中
a = list(map(int, input().split()))
# 注释掉的部分表明原本可能想要对列表a进行降序排序,但这里并未使用
# a.sort(reverse=True)
# print(a)
# 创建一个空字典dic,用于存储节点之间的连接关系
dic = {}
# 循环n-1次(因为n个节点只需要n-1条边来确定连接关系)
for i in range(n-1):
# 读取两个整数u和v,表示节点u连接到节点v
u, v = map(int, input().split())
# 将节点u连接到节点v的信息存储在字典dic中
# 注意:这里假设了图是有向的,且每个节点只记录一次出边
dic[u] = v
# 初始化一个变量sum用于累加所有节点的权重之和(除了直接相连的节点)
sum = 0
# 遍历字典dic中的所有键(即所有节点)
for i in dic.keys():
# 初始化变量num,用于累加当前节点i不直接相连的节点的权重
num = 0
# 遍历列表a中的所有节点(索引为j,节点值为a[j])
for j in range(n):
# 如果节点i不直接连接到节点j+1(因为节点编号从1开始,但索引从0开始),
# 并且节点i本身也不是节点j+1,则将节点j+1的权重加到num上
if dic.get(i, None) != j + 1 and i != j + 1:
num += a[j]
# 将num(即节点i不直接相连的节点的权重之和)加到sum上
sum += num
# 打印出所有节点不直接相连的节点的权重之和
print(sum)