#P1343. Rooted Trees Isomorphism

Rooted Trees Isomorphism

题目描述

同构性问题旨在检验两个图是否本质上相同。假设给定一组图,需要对每个图执行某种操作。若能识别出哪些图是重复的,就可将其舍弃,从而避免冗余工作。

首先要解释两个图“相同”的含义。当能找到一个从图 G1=(V1,E1)G_1=(V_1, E_1) 的顶点到图 G2=(V2,E2)G_2=(V_2, E_2) 的顶点的映射 ff,使得 (x,y)(x, y)G1G_1 的一条边当且仅当 (f(x),f(y))(f(x), f(y))G2G_2 的一条边时,这两个带标签的图 G1G_1G2G_2 是相同的。这样的映射被称为同构映射

对于一般的图同构问题,目前还没有已知的高效算法,但判断两棵树是否同构相对容易。在7图 7 中,不难验证树 T1T_1 与树 T3T_3 同构,但 T1T_1T2T_2 不同构。

</p>

给定一组 kk 棵树 C={T1,T2,,Tk}C = \{T_1, T_2, \cdots, T_k\},每棵树 TiT_i 恰好有 nn 个节点。本题的目标是将这些树划分为同构类,使得同一同构类中的任意两棵树彼此同构。

一种简单的方法是枚举所有可能的映射函数,这需要生成 n!n! 种不同的映射。其结果是,仅测试两棵树就会得到一个非常耗时的 O(n!)O(n!) 时间复杂度的算法。你需要想出一个更巧妙的方法来解决这个问题。

输入

一组 kk 棵(每棵树有 nn 个节点)的树 C={T1,T2,,Tk}C = \{T_1, T_2, \cdots, T_k\}。输入是一个整数列表。前两个整数(在同一行)分别表示树的数量 kk 和每棵树的节点数 nn。注意,kk 最大可达 150150nn 最大可达 100100。在这两个整数之后,会有 kk 行,每行表示每棵树 TiT_i 的边集;每行恰好包含 n1n - 1 对整数,代表每棵树的 n1n - 1 条(有向)边。因此,每棵树共有 2n22n - 2 个整数,除了前两个参数外,总输入将有 2k(n1)2k(n - 1) 个整数。每棵树按其出现的顺序编号;即,第一行表示树 T1T_1,第二行表示 T2T_2,以此类推,最后(第 kk 行)表示 TkT_k

输出

对于给定的树集合,将这些树划分为同构类,使得同一同构类中的任意两棵树彼此同构。对于每个同构类,在一行中输出这些同构树的编号。假设共有 mm 个同构类,你需要输出 mm 行。例如,一行

t1=t2==tp;t_1 = t_2 = \cdots = t_p;

表示一个大小为 pp 的同构类,其中两棵树 TtiT_{t_i}TtjT_{t_j}1i,jp1\leq i, j \leq p)彼此同构。对于每一行,按升序输出那些同构树的编号;即,t1<t2<<tpt_1 < t_2 < \cdots < t_p。此外,按字典序升序输出这 mm 个同构类;即,按它们第一个编号的顺序输出。例如,假设存在 44 个同构类 {4,2,7}\{4, 2, 7\}{5,1,3}\{5, 1, 3\}{8,9}\{8, 9\}{6}\{6\},输出应为

1=3=5;1 = 3 = 5 ;

2=4=7;2 = 4 = 7 ;

6;6 ;

8=9;8 = 9 ;

输入样例

3 7
7 2 7 1 7 6 2 3 1 4 6 5
7 2 7 1 2 3 1 4 1 5 5 6
4 3 3 2 4 1 1 7 5 6 4 5

输出样例

1 = 3 ;
2 ;

题目来源

台湾 2002 年竞赛题目