SZ#G6MT28. 【GESP强化 六级】竖直路径

提交1 通过1
通过率100%
时间限制2000ms
内存限制256MiB
    ID: 11460 传统题 2000ms 256MiB 尝试: 1 已通过: 1 难度: 普及 上传者: 标签>GESPGESP强化C++c++编程题多叉树有根树父指针路径分解

题目描述

刘老师要处理 TT 棵有根树。每棵树中,每个顶点都给出了自己的父亲;根节点把自己作为父亲。

一条竖直路径是一个顶点序列 v1,v2,,vkv_1,v_2,\ldots,v_k,其中对于每个 1i<k1\le i<k,顶点 viv_i 都是顶点 vi+1v_{i+1} 的父亲。现在要把树中的全部顶点恰好分配到若干条互不相交的竖直路径中,并让路径条数尽可能少。

为了使输出结果唯一,本题采用下面的固定约定:按照叶子编号从小到大处理;对于当前叶子,沿父指针向上收集所有尚未放入其他路径的顶点,再把收集到的序列反转,得到一条从祖先到后代的竖直路径。

输入格式

第一行输入一个整数 TT,表示测试数据组数。

每组数据的第一行输入一个整数 NN,表示顶点数量。

第二行输入 NN 个整数 p1,p2,,pNp_1,p_2,\ldots,p_N,其中 pip_i 表示顶点 ii 的父亲。根节点 rr 满足 pr=rp_r=r

输出格式

对于每组数据,先输出一个整数 kk,表示最少路径条数。

随后依次输出这 kk 条路径。每条路径先输出它包含的顶点数量,再输出路径中的顶点序列。

每组数据输出结束后再输出一个空行。

3
4
1 1 2 1
10
1 1 1 1 1 5 1 2 2 3
6
1 1 2 3 4 3
2
3
1 2 3
1
4

6
2
1 4
2
5 6
1
7
2
2 8
1
9
2
3 10

2
5
1 2 3 4 5
1
6
1
10
1 1 1 2 4 2 3 5 4 6
4
3
1 3 7
4
2 4 5 8
1
9
2
6 10
1
8
1 1 2 1 4 1 2 2
5
3
1 2 3
2
4 5
1
6
1
7
1
8

数据范围与约定

  • 1T1041\le T\le10^4
  • 所有测试组的 NN 之和不超过 2×1052\times10^5
  • 父亲数组描述一棵有根树且根满足 pr=rp_r=r