检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
#题面
本文中所给出的题面为原题面的中文翻译,并非原始题面。翻译如有错误之处,请联系指出。
#题目描述
给定一棵由 个顶点组成的有根树。顶点由 到 编号。任何顶点都可以是树的根。
请在树上找出这样一组路径:
- 每个顶点恰好属于一条路径,每条路径可以包含一个或多个顶点;
- 在每条路径中,每个节点的下一个节点是当前节点的子节点(即路径总是向下 —— 从父节点到子节点);
- 路径的数量最少。
#输入格式
第一行输入一个整数 表示该测试点内测试数据的组数。
每组测试点的第 行包含一个整数 表示树的节点个数。第 行包含 个整数,第 个整数 表示第 个节点的父节点为 。根节点的父亲是它本身。
#输出格式
对于每组测试数据:
第 行输出一个整数 表示组内路径的数量。
然后输出 条路径的信息:
- 第 行输出路径的长度;
- 第 行按照从上到下的顺序输出该路径内的的所有节点编号。
在每组测试数据的末尾输出一个空行。
如果有多种答案,输出其中的任何一种即可。
#输入输出样例
输入样例 #1
6
5
3 1 3 3 1
4
1 1 4 1
7
1 1 2 3 4 5 6
1
1
6
4 4 4 4 1 2
4
2 2 2 2
输出样例 #1
3
3
3 1 5
1
2
1
4
2
2
1 2
2
4 3
1
7
1 2 3 4 5 6 7
1
1
1
3
3
4 1 5
2
2 6
1
3
3
2
2 1
1
3
1
4
样例解释 #1
以该测试点中的第一组数据为例,有三条路径:
- ,长度为 ;
- ,长度为 ;
- ,长度为 。
#数据范围与约定
对于 的数据,,,。
数据保证每个测试点中的所有测试数据中 的总和不超过 。
#思路
看到这道题的样例说明之后第一眼想到的是树链剖分(图源 OI Wiki):
按照这样剖出来的答案显然是对的。
再看看样例会发现一个很显然的结论:最小路径数一定是叶子节点数。
可以使用深度优先搜索,遇到分叉的时候就新开其他路径,同时挑选一个方向继续当前路径,这样出来的答案一定是最优的。
具体实现可以看代码。
#代码
1 |
|