Description
给定一棵有n个点,m个叶子节点的树,其中m个叶子节点分别为1到m号点,每个叶子节点有一个权值r[i]。你需要给剩下n-m个点各指定一个权值,使得树上相邻两个点的权值差的绝对值之和最小。
Input
第一行包含两个正整数n,m(2<=n<=500000,1<=m<=n),分别表示点数和叶子数。
接下来n-1行,每行两个正整数u,v(1<=u,v<=n),表示u与v之间有一条边。
接下来m行,每行一个正整数,依次为r[1],r[2],…,rm,表示每个叶子的权值。
Output
输出一个整数,即树上相邻两个点的权值差的绝对值之和的最小值。
Sample Input
6 4
1 5
2 5
3 6
4 6
5 6
5
10
20
40
Sample Output
35
HINT
Source
By Claris
这题不会做..后来看了Claris题解..
大致就是拆掉叶子点,重构一下图,然后可以从孩子逆推到父亲节点的取值范围.
Claris的题解
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 500010
#define LL long long
#define GET (ch>='0'&&ch<='9')
using namespace std;
int n,m,top,tp;
int c,head=1,tail;
LL