//f[i]表示以i为根子树归零累加值,g{i]表示累减值
//肯定是先搞定底部再搞上面
#include<bits/stdc++.h>
using namespace std;
const int maxn = 300010;
int n, a[maxn], st[maxn], tot = 0;
long long f[maxn], g[maxn];
struct node{
int v, nxt;
} edge[2*maxn];
inline void in(int x, int y){
edge[++tot].v = y;
edge[tot].nxt = st[x];
st[x] = tot;
}
inline void dfs(int x, int fa){
for(int i = st[x]; i; i = edge[i].nxt){
int to = edge[i].v;
if(to == fa) continue;
dfs(to, x);
f[x] = max(f[x], f[to]);
g[x] = max(g[x], g[to]);
}
long long t = f[x] - g[x] + a[x];
if(t > 0) g[x] += t;
else if(t < 0) f[x] -= t;//注意t是负数,所以要减
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1, x, y; i < n; i++){
scanf("%d%d", &x, &y);
in(x, y);
in(y, x);
}
dfs(1, 0);
printf("%lld\n", f[1]+g[1]);
return 0;
}
SDSC 2017 Day5 T2
最新推荐文章于 2019-10-29 22:06:55 发布