首先每个顶点的值。如果,证明如下:
假设有个靠近顶点的顶点满足
假设有个靠近顶点的顶点满足
那么当时,将减小到会使得整棵树的美丽值增大
时,将增大到会使得整棵树的美丽值增大
时,将变成会使得整棵树的美丽值不变或增大

定义表示时,的子树的美丽值之和,同理。

MyCode:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const int maxn = 1e5 + 7, maxm = 2e5 + 7;
int head[maxn],Next[maxm],to[maxm],tot;
inline void add(int x,int y) {
    to[++tot]=y;
    Next[tot]=head[x];
    head[x]=tot;
}
int l[maxn],r[maxn],f[maxn][2];
void dfs(int x,int fa) {
    for(int i=head[x],y;i;i=Next[i]) {
        if((y=to[i])==fa) continue;
        dfs(y,x);
        f[x][0]+=max(f[y][1]+abs(l[x]-r[y]),f[y][0]+abs(l[x]-l[y]));
        f[x][1]+=max(f[y][1]+abs(r[x]-r[y]),f[y][0]+abs(r[x]-l[y]));
    }
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int _,n;
    cin>>_;
    while(_--) {
        cin>>n; tot=0;
        for(int i=1;i<=n;++i) cin>>l[i]>>r[i],f[i][0]=f[i][1]=head[i]=0;
        for(int i=2,x,y;i<=n;++i) {
            cin>>x>>y;
            add(x,y); add(y,x);
        }
        dfs(1,0);
        cout<<max(f[1][0],f[1][1])<<'\n';
    }
    return 0;
}