#P15993. [PA 2026] Prüfer 序列 / Kod Prüfera

[PA 2026] Prüfer 序列 / Kod Prüfera

题目背景

$\large{\bf{\textcolor{red}{警告:滥用本题评测,一次即可封号甚至封禁\ IP。}}}$

$\large{\bf{\textcolor{red}{已有多人因相关行为受到学校处分,切记前人教训。}}}$

由于评测机性能差异,本题时限下调 55 秒。

题目描述

给定一棵有 nn 个顶点(其中 n>2n > 2)的树,顶点编号为 1 到 nn,其 Prüfer 序列是一个长度为 n2n - 2 的唯一确定的数列,可以通过以下简单算法得到:

当树的顶点数超过两个时:

  • 找到编号最小的度为 1 的顶点
  • 将其唯一邻居的编号加入序列
  • 从树中删除该顶点

可以证明,每个由 1 到 nn 之间的数组成的长度为 n2n - 2 的序列都是某棵树的 Prüfer 序列,并且 Prüfer 序列唯一地确定了它所来源的树。关于 Prüfer 序列的这些以及其他有趣的事实,可参阅 OI-wiki 或其他资料。

在本题中,我们给定一棵树,并考虑由该树顶点的不同编号方式所生成的 Prüfer 序列。若 SS 是某种顶点编号方式(即,形式上是从顶点集合到集合 {1,,n}\{1,\dots,n\} 的一个单射函数),则用 K(S)K(S) 表示在该编号方式下树的 Prüfer 序列。

你的任务是求给定树的字典序最小的 Prüfer 序列,即存在某种顶点编号方式 SS 使得该序列等于 K(S)K(S),且对于任意其他顶点编号方式 SS',要么 K(S)=K(S)K(S) = K(S'),要么在 K(S)K(S)K(S)K(S') 第一个不同的位置上,K(S)K(S') 中的数更大。

你需要对 tt 个独立的测试用例求解本题。

输入格式

输入的第一行包含一个整数 tt1t10001 \leq t \leq 1000),表示需要求解的测试用例数量。

每个测试用例的描述以一行开始,该行包含一个整数 nn3n10003 \leq n \leq 1000),表示树的顶点数。树的顶点编号为 1 到 nn,但此编号不一定对应字典序最小的 Prüfer 序列。

接下来 n1n - 1 行描述树的边。每行包含两个整数 aia_ibib_i1ai,bin, aibi1 \leq a_i, b_i \leq n,\ a_i \neq b_i),表示顶点 aia_i 与顶点 bib_i 之间有一条边相连。

所有测试用例的 nn 之和不超过 5000。

输出格式

输出 tt 行,每个测试用例对应一行。第 ii 行输出一个长度为 n2n - 2 的数列,即第 ii 个测试用例中树在最优顶点编号方式下字典序最小的 Prüfer 序列。

2
5
1 2
2 3
3 4
3 5
16
8 1
9 1
10 1
11 2
12 2
2 3
13 4
4 3
14 5
15 5
5 3
3 1
1 6
6 7
7 16
1 1 2
1 1 1 2 2 3 4 3 5 5 3 1 6 7

提示

样例解释

在第一个测试用例中,给出字典序最小的 Prüfer 序列的顶点编号方案示例为 151 \to 5222 \to 2313 \to 1444 \to 4535 \to 3
对于这样的编号方式,Prüfer 序列求解算法在第一步将选择新编号为 33 的顶点(并将 11 加入序列,即其唯一邻居的新编号)。在第二步中,将选择新编号为 44 的顶点(其唯一邻居同样是 11)。在第三步中(删除顶点 3344 后),顶点 11 已成为叶子节点,将被选中,其邻居的编号 22 将作为序列的最后一个元素被加入。
在第二个测试用例中,最优方案是完全不对顶点重新编号,此外,输入中边的顺序与 Prüfer 序列求解算法中删除叶子节点的顺序一致。