【PA2015】【BZOJ4297】Rozstaw szyn

给定一棵有n个点,m个叶子节点的树,需要指定非叶子节点的权值使得相邻节点权值差绝对值之和最小。输入包括树的结构和叶子节点的权值,输出最小的权值差之和。样例输入描述了一个6节点、4叶子节点的树,输出为35。解决方法涉及重构图并从孩子节点逆推父亲节点的取值范围。
摘要由CSDN通过智能技术生成

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 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值