#CF2131D. 树的压缩操作
树的压缩操作
D. 树的压缩操作
每次测试的时间限制: 秒
每次测试的内存限制: 兆字节
Kagari 正在准备归档一棵树,她知道归档的成本取决于树的直径。为了降低成本,她的目标是首先尽可能缩小直径。她可以对树执行以下操作:
- 选择两个顶点 和 。设从 到 的简单路径 上的顶点序列为 ,其中 ,。
- 删除路径上的所有边。即删除边 。
- 将顶点 直接连接到 。即添加边 。
可以证明,操作后得到的图仍然是一棵树。
请帮助她求出达成最小直径所需的最少操作次数。
树的直径:树中任意两点之间最长路径的长度。路径长度由路径上的边数衡量。
简单路径:树中连接两个顶点且不重复经过任何顶点的路径。可以证明,树中任意两点之间的简单路径是唯一的。
输入
每个测试包含多个测试用例。第一行包含一个整数 ()——测试用例的数量。接下来是每个测试用例的描述。
每个测试用例的第一行包含一个整数 ()——树的顶点数。
接下来的 行描述树的边。每行包含两个整数 和 (,),表示顶点 和 之间有一条边。保证这些边构成一棵树。
保证所有测试用例的 之和不超过 。
输出
对于每个测试用例,输出一个整数——使直径最小所需的最少操作次数。
示例
输入
4
4
1 2
1 3
2 4
2
2 1
4
1 2
2 3
2 4
11
1 2
1 3
2 4
3 5
3 8
5 6
5 7
7 9
7 10
5 11
输出
1
0
0
4
说明
第一个测试用例:
原始树的直径是 。Kagari 可以对 和 执行一次操作。如下图所示,操作步骤包括:
- 删除边 、 和 。
- 添加边 、 和 。
操作后,树的直径减少到 。可以证明 是可达到的最小直径。
第二个测试用例:
树的直径是 。可以证明 已经是最小直径,因此她可以不进行任何操作。