介绍
在这个挑战中,您的任务是编写一个程序,该程序确定两个给定的树是否同构。树表示有向无环图,其中除根节点之外,每个节点都只有一个输出边缘。如果可以通过重命名节点将一棵树转换为另一棵树,则两棵树是同构的。例如,两棵树(每个边缘朝上)
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
输入项
您的输入是两个非负整数列表,以本机格式或您的语言给出。它们以上面指定的方式编码两棵树。您可以假设以下条件:
- 他们不是空的。
- 它们具有相同的长度。
- 每个列表都
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]
1
相关:数学家声称复杂性理论取得突破
—
Digital Trauma 2015年
@DigitalTrauma Dangit,您使OP不允许内置函数...我有一个60字节的Mma解决方案...
—
LegionMammal978 2015年