Introducción
En este desafío, su tarea es escribir un programa que decida si dos árboles dados son isomórficos. Un árbol significa un gráfico acíclico dirigido donde cada nodo tiene exactamente un borde saliente, excepto la raíz, que no tiene ninguno. Dos árboles son isomórficos si uno puede transformarse en otro cambiando el nombre de los nodos. Por ejemplo, los dos árboles (donde cada borde apunta hacia arriba)
0 0
/|\ /|\
1 3 4 1 2 5
|\ /|
2 5 3 4
son fácilmente vistos como isomorfos.
Codificamos un árbol como una lista L
de enteros no negativos de la siguiente manera. La raíz del árbol tiene etiqueta 0
y también tiene nodos 1,2,...,length(L)
. Cada nodo i > 0
tiene un borde saliente para L[i]
(usando indexación basada en 1). Por ejemplo, la lista (con los índices dados bajo los elementos)
[0,0,1,3,2,2,5,0]
1 2 3 4 5 6 7 8
codifica el árbol
0
/|\
1 2 8
| |\
3 5 6
| |
4 7
Entrada
Sus entradas son dos listas de enteros no negativos, en formato nativo o en su idioma. Codifican dos árboles de la manera especificada anteriormente. Puede asumir las siguientes condiciones sobre ellos:
- No están vacíos
- Tienen la misma longitud.
- Cada lista
L
satisfaceL[i] < i
todos los índices (basados en 1)i
.
Salida
Su salida será un valor verdadero si los árboles son isomorfos, y un valor falso si no.
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. No hay restricciones de tiempo, pero los incorporados que deciden el isomorfismo de árbol o gráfico no están permitidos.
Casos de prueba
Instancias de verdad
[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]
Instancias falsas
[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]
Respuestas:
Mathematica, 48 bytes
Es incluso más corto que la solución que usa
IsomorphicGraphQ
:fuente
Python, 83
La función anónima en la segunda línea es mi solución.
f
devuelve una forma canonizada de un subárbol que es una lista ordenada de sus hijos canonizados. Luego, simplemente debemos verificar si las formas canonizadas de cada árbol son iguales.fuente