#P1343. Rooted Trees Isomorphism
Rooted Trees Isomorphism
题目描述
同构性问题旨在检验两个图是否本质上相同。假设给定一组图,需要对每个图执行某种操作。若能识别出哪些图是重复的,就可将其舍弃,从而避免冗余工作。
首先要解释两个图“相同”的含义。当能找到一个从图 的顶点到图 的顶点的映射 ,使得 是 的一条边当且仅当 是 的一条边时,这两个带标签的图 和 是相同的。这样的映射被称为同构映射。
对于一般的图同构问题,目前还没有已知的高效算法,但判断两棵树是否同构相对容易。在 中,不难验证树 与树 同构,但 与 不同构。
</p>
给定一组 棵树 ,每棵树 恰好有 个节点。本题的目标是将这些树划分为同构类,使得同一同构类中的任意两棵树彼此同构。
一种简单的方法是枚举所有可能的映射函数,这需要生成 种不同的映射。其结果是,仅测试两棵树就会得到一个非常耗时的 时间复杂度的算法。你需要想出一个更巧妙的方法来解决这个问题。
输入
一组 棵(每棵树有 个节点)的树 。输入是一个整数列表。前两个整数(在同一行)分别表示树的数量 和每棵树的节点数 。注意, 最大可达 , 最大可达 。在这两个整数之后,会有 行,每行表示每棵树 的边集;每行恰好包含 对整数,代表每棵树的 条(有向)边。因此,每棵树共有 个整数,除了前两个参数外,总输入将有 个整数。每棵树按其出现的顺序编号;即,第一行表示树 ,第二行表示 ,以此类推,最后(第 行)表示 。
输出
对于给定的树集合,将这些树划分为同构类,使得同一同构类中的任意两棵树彼此同构。对于每个同构类,在一行中输出这些同构树的编号。假设共有 个同构类,你需要输出 行。例如,一行
表示一个大小为 的同构类,其中两棵树 和 ()彼此同构。对于每一行,按升序输出那些同构树的编号;即,。此外,按字典序升序输出这 个同构类;即,按它们第一个编号的顺序输出。例如,假设存在 个同构类 、、、,输出应为
输入样例
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 年竞赛题目