33OJ
登录 注册

#CF2131D. 树木收缩 / Arboris Contractio

树木收缩 / Arboris Contractio

题目描述

Kagari 准备存档一棵树,存档的开销取决于这棵树的直径。为了降低开销,她希望先把树的直径缩到尽可能小。她可以对这棵树执行如下操作:

  1. 选定两个顶点 ss 和 tt。设从 ss 到 tt 的简单路径上的顶点依次为 v0,v1,…,vkv_0,v_1,\dots,v_k,其中 v0=sv_0=s,vk=tv_k=t。
  2. 删除这条路径上所有边,也就是删掉边 (v0,v1),(v1,v2),…,(vk−1,vk)(v_0,v_1),(v_1,v_2),\dots,(v_{k-1},v_k)。
  3. 将顶点 v1,v2,…,vkv_1,v_2,\dots,v_k 直接连向 v0v_0。也就是添加边 (v0,v1),(v0,v2),…,(v0,vk)(v_0,v_1),(v_0,v_2),\dots,(v_0,v_k)。

可以证明,操作之后得到的图仍然是一棵树。

请你求出:要让直径达到理论最小值,至少需要多少次操作。

树的直径定义:任意一对顶点之间距离的最大值;距离定义为两点唯一简单路径上边的条数。

简单路径定义:树上两点之间不重复经过任何顶点的路径,可以证明树上任意两点的简单路径唯一。

输入格式

多组测试用例。第一行一个整数 tt(1≤t≤1041 \le t \le 10^4),代表测试用例数量。

每组测试用例第一行输入一个整数 nn(2≤n≤2⋅1052 \le n \le 2\cdot 10^5),代表树的顶点个数。

接下来 n−1n-1 行描述这棵树,每行两个整数 u,vu,v(1≤u,v≤n,u≠v1 \le u,v \le n, u\neq v),代表 uu 和 vv 之间有一条边。保证给出的边构成一棵树。

保证所有测试用例的 nn 之和不超过 2⋅1052\cdot 10^5。

输出格式

对每组测试用例,输出一个整数:在让直径取到最小的前提下,所需的最少操作次数。

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

说明

在第一个测试样例中,原树直径为 33。Kagari 可以选取 s=3,t=4s=3,t=4 执行一次操作,操作过程如下:

  1. 删除边 (3,1),(1,2),(2,4)(3,1),(1,2),(2,4);
  2. 添加边 (3,1),(3,2),(3,4)(3,1),(3,2),(3,4)。

操作之后,树的直径变为 22,并且可以证明 22 是该树能达到的最小直径。

第二个测试样例中,树的直径已经是 11,这就是它能达到的最小值,不需要执行任何操作。

原题链接

原题链接