#P2567. Code the Tree

    ID: 1568 传统题 1000ms 256MiB 尝试: 5 已通过: 1 难度: 10 上传者: 标签>树结构优先队列Prüfer编码Ulm Local 2001

Code the Tree

中文题面:

描述

给定一棵用整数1,2,...,n1, 2, ..., n编号的树(即无环的连通图)。

这棵树的"Prufer"编码构建方式如下: 选择编号最小的叶子节点(只连接一条边的顶点),将该叶子节点及其连接的边从图中移除,并记录下与该叶子节点相邻的顶点的编号。在剩下的图中重复这个过程,直到只剩下一个顶点(根据定义,这个顶点总是编号为nn的顶点)。 记录下的n1n-1个编号序列即为该树的Prufer编码。

你的任务是,给定一棵树,计算它的Prufer编码。树的表示方式遵循以下语法规则:

T ::= "(" N S ")"
S ::= " " T S
    | empty
N ::= number

也就是说,树被括号包围,括号内是一个表示根顶点编号的数字,后面跟着任意数量(可能为零)的子树,子树之间用单个空格分隔。

例如,样例输入中的第一行表示的图可以参见下图。你可以使用问题2568的解决方案来生成更多的样例输入。

需要注意的是,根据上面的定义,树的根顶点也可能是一个叶子节点。 我们指定一个顶点作为根只是为了表示方便。通常情况下,我们处理的是"无根树"。

输入:

输入包含多个测试用例。每个测试用例在一行中按照上述语法规则描述了一棵树。

输入以文件结束符(EOFEOF)结束。假设1<=n<=501<=n<=50

输出:

对于每个测试用例,输出一行包含该树对应的Prufer编码。

编码中的数字用单个空格分隔。行尾不要输出任何空格

输入数据1

(2 (6 (7)) (3) (5 (1) (4)) (8))
(1 (2 (3)))
(6 (1 (4)) (2 (3) (5)))

输出数据1

5 2 5 2 6 2 8
2 3
2 1 6 2 6

来源

ACM国际大学生程序设计竞赛(ACM-ICPC) 德国乌尔姆大学分站赛