这些树是同构的吗?


21

介绍

在这个挑战中,您的任务是编写一个程序,该程序确定两个给定的树是否同构。树表示有向无环图,其中除根节点之外,每个节点都只有一个输出边缘。如果可以通过重命名节点将一棵树转换为另一棵树,则两棵树是同构的。例如,两棵树(每个边缘朝上)

  0       0
 /|\     /|\
1 3 4   1 2 5
|\       /|
2 5     3 4

很容易看出来是同构的。

我们L通过以下方式将树编码为非负整数列表。树的根具有标签0,并且还具有节点1,2,...,length(L)。每个节点i > 0都有一个传出边缘L[i](使用基于1的索引)。例如,列表(在元素下给出索引)

[0,0,1,3,2,2,5,0]
 1 2 3 4 5 6 7 8

编码树

  0
 /|\
1 2 8
| |\
3 5 6
| |
4 7

输入项

您的输入是两个非负整数列表,以本机格式或您的语言给出。它们以上面指定的方式编码两棵树。您可以假设以下条件:

  1. 他们不是空的。
  2. 它们具有相同的长度。
  3. 每个列表都L满足L[i] < i所有(基于1的)索引i

输出量

如果树是同构的,则您的输出应为真实值,否则为假值。

规则和计分

您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。没有时间限制,但是不允许使用用于确定树或图同构的内置函数。

测试用例

真实实例

[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]

虚假实例

[0,0] [0,1]
[0,1,2,0,3,3,4] [0,1,2,3,0,4,3]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,5,2,1]
[0,1,1,0,1,3,2,1,5] [0,1,0,3,3,3,2,5,2]
[0,1,2,3,1,2,3,0,8] [0,1,0,1,4,4,5,6,6]
[0,1,0,2,0,3,0,4,0,5] [0,0,2,1,0,3,4,0,0,9]


@DigitalTrauma Dangit,您使OP不允许内置函数...我有一个60字节的Mma解决方案...
LegionMammal978 2015年

Answers:


2

Mathematica,48个字节

SameQ@@(Sort//@(0(0//.PositionIndex@#))&/@{##})&

它甚至比使用的解决方案还短IsomorphicGraphQ

IsomorphicGraphQ@@(Graph@*MapIndexed[#->Tr@#2&]/@{##})&

6

Python,83岁

第二行上的匿名函数是我的解决方案。

f=lambda l,i=0:sorted(f(l,j+1)for j,e in enumerate(l)if e==i)
lambda a,b:f(a)==f(b)

f返回子树的规范化形式,该子树是其规范化子级的排序列表。然后,我们必须简单地检查每棵树的规范化形式是否相等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.