#lydlx04x0911. 权值 Race
权值 Race
题目描述
给定一棵 个节点的树,每条边带有一个权值。
求一条简单路径,路径上各条边的权值和等于 ,且路径包含的边的数量最少。
输入格式
第一行两个整数 。
第 行每行三个整数 ,表示一条无向边的两个端点 和权值 ,点的编号从 开始。
输出格式
输出一个整数,表示最少边数量。
如果不存在满足要求的路径,输出 。
样例
4 3
0 1 1
1 2 2
1 3 4
2
样例解释
树的结构
0
|
1---1
| |
2 3
边权:
- 边 (0,1): 权值 1
- 边 (1,2): 权值 2
- 边 (1,3): 权值 4
寻找权值和为 3 的路径
可能的路径:
- 0 → 1 → 2:权值和 = 1 + 2 = 3,边数 = 2
- 0 → 1 → 3:权值和 = 1 + 4 = 5(不符合)
- 2 → 1 → 3:权值和 = 2 + 4 = 6(不符合)
满足权值和为 3 的路径只有 0 → 1 → 2,边数为 2。
因此输出 2。
数据范围
算法分析
此题是典型的树上路径问题,要求权值和恰好为 且边数最少。由于 较大(), 也较大(),需要采用高效算法。
思路
可以使用点分治(树分治)解决:
- 每次找到当前子树的重心作为根。
- 对于当前重心,计算所有经过该重心的路径,检查是否有权值和为 的路径,并更新最少边数。
- 递归处理重心的各个子树。
在计算经过重心的路径时,需要记录从重心到各个点的距离(权值和)以及边数,并用一个数组(或哈希表)记录某个距离对应的最少边数,以便快速查找互补值。
复杂度
点分治的复杂度为 ,配合合适的查找结构(如数组或哈希表)可以高效解决问题。
边界情况
- 如果没有任何路径权值和为 ,输出 。
- 注意权值可能为 0,路径可能只包含一条边。
提示
实现时需要注意:
- 使用重心分解保证递归层数为 。
- 使用数组记录距离时,数组大小至少为 (因为距离可能超过 ,但超过 的路径无需记录)。
- 注意清零操作,避免不同子树之间的路径被错误合并。