#P7130. 「RdOI R1」平衡常数(balance)

「RdOI R1」平衡常数(balance)

题目描述

给定一棵以 11 为根的点带权有根树 G=(V,E)G=(V,E),第 ii 个节点的权值记为 wiw_i,以 ii 为根的子树的点集记为 ViV_i,求一个点集 V′⊆VV'\subseteq V,满足以下条件:

  • ∀i\forall i,都有 ∣Vi∩V′∣≤⌊∣Vi∣2⌋|V_i \cap V'| \le \lfloor \frac{|V_i|}{2} \rfloor

  • 最大化 ∑i∈V′wi\sum _{i \in V'} w_i

输出 ∑i∈V′wi\sum _{i\in V'} w_i 即可,也就是选取的点的权值和。

输入格式

第一行为一个正整数 nn。

第二行为 nn 个正整数 wiw_i。

接下来 n−1n-1 行每行为两个整数 u,vu,v,表示第 ii 条边的两个端点。

输出格式

输出只有一行,为你所求得的最大总和。

3
1 2 3
1 2
1 3
1

提示

【数据范围】

测试点编号 n≤n\leq wi≤w_i\leq 特殊性质
1∼21\sim2 1010 10310^3
3∼53\sim 5 2×1032 \times 10^3
6∼126\sim12 10510^5
13∼1613\sim16 5×1055 \times 10^5 10910^9 v=u+1v=u+1
17∼2517\sim25

对于 100%100\% 的数据,1≤n≤5×1051 \leq n \leq 5 \times 10^5,0<wi≤1090 < w_i \leq 10^9,1≤u,v≤n1 \leq u,v \leq n。


【说明/提示】

  • Idea From : LCuter

【文件读入读出】(模拟,提交代码时不需使用)

  • 文件名:balance.cpp
  • 读入文件名:balance.in
  • 读出文件名:balance.out