Un gráfico elegante es un tipo de gráfico simple . Los gráficos elegantes son especiales porque hay una manera de etiquetar todos sus nodos con enteros positivos para que cuando los bordes también se etiqueten con las diferencias de los nodos que se conectan, no haya dos bordes con la misma etiqueta y cada etiqueta hasta el número de bordes es usado
Ejemplo resuelto
Aquí hay un gráfico simple que sospechamos que es un gráfico elegante
Probemos el siguiente etiquetado:
Tenga en cuenta que se nos permite omitir enteros en nuestro etiquetado de nodos. Ahora etiquetamos cada borde con la diferencia positiva entre los nodos que conecta. Para mayor visibilidad, los he etiquetado en rojo.
Cada borde tiene un número único y no queda ningún número entre 1 y 7 (el número de bordes que tenemos). Por lo tanto, nuestro gráfico es elegante.
Tarea
Dado un gráfico, a través de cualquier método razonable de entrada, genera un valor verdadero si es correcto y un valor falso de lo contrario.
Este es el código de golf, por lo que el objetivo es minimizar el recuento de bytes.
Casos de prueba
Aquí los gráficos se representan como una matriz de aristas:
3 nodes:
[(0,1),(0,2),(1,2)]
True
Labeling:
Node 0 -> 0
Node 1 -> 2
Node 2 -> 3
5 nodes:
[(0,1),(0,4),(1,2),(2,3),(3,4)]
False
5 nodes:
[(0,1),(1,2),(2,3),(3,4)]
True
Labeling:
Node 0 -> 0
Node 1 -> 1
Node 2 -> 3
Node 3 -> 6
Node 4 -> 10
9 nodes
[(0,1),(1,2),(1,7),(1,8),(2,3),(2,6),(3,4),(4,5)]
True
Labeling:
Node 0 -> 0
Node 1 -> 1
Node 2 -> 3
Node 3 -> 6
Node 4 -> 10
Node 5 -> 15
Node 6 -> 11
Node 7 -> 7
Node 8 -> 8
5 nodes
[(0,1),(0,2),(1,2),(1,3),(1,4),(3,4)]
False
fuente
[(0,1),(1,2),(2,3),(3,4)]
es probablemente un caso marginal notable.{(k-1,k) : 0 < k < n}
requieren las etiquetas más altas de todos los gráficos con el mismo número de nodos.n(n+1)/2
como su etiqueta más alta. He añadido tu caso de prueba.Respuestas:
Jalea , 12 bytes
Toma una matriz de aristas como pares de nodos indexados 1.
Pruébalo en línea! (Horriblemente ineficaz. No te molestes con los casos de prueba reales).
Cómo funciona
fuente
ḅ-
es uno de mis trucos favoritos de Jelly :-)Mathematica,
121116bytesEditar: Guardado 5 bytes gracias a JungHwan Min y Martin Ender
Explicación
Función pura que toma un
Graph
objeto de Mathematica con vértices{1, 2, ..., k}
para algún entero no negativok
. En el peor de los casos, solo necesitaremos etiquetas de vértice que vayan de1
a1 + (1 + 2 + ... EdgeCount@#)
. Como nos ahorra algunos bytes más adelante, dejaremose
la lista de aristas yn
la lista{1, 2, ..., EdgeCount@#}
, de modo que se extraerán los pesos de los vérticesRange[1+Tr[n=Range@Length[e=EdgeList@#]]]
. Generamos una lista de todas lasTuples
longitudesVertexCount@#
, luego elegimos lasCases
que dan etiquetas elegantes y verificamos que el resultado estéUnequal
en la lista vacía{}
. La gracia de la lista de pesos de vérticesw
se verifica haciendoMap
ping a la funciónAbs[#-#2]&@@w[[List@@#]]&
sobre la lista de aristase
,Sort
registrando el resultado y verificando si el resultado esEqual
an
. Aquí hay un desglose de esa función:fuente
VertexCount[#]
->VertexCount@#
Tr
truco paraLength
ya no guarda bytes si necesita agregar paréntesis.Length[e=EdgeList@#]
es de la misma longitud Pero es más corto evitarlo por completo y reescribir el número triangular allí comoTr@Range@EdgeCount@#
(y luego reemplazarloe
al final conEdgeList@#
. Segundo, el operador de función rara vez guarda bytes, en este caso creo que es más corto de usar enCases
lugar deSelect
y luego enw_/;
lugar dew
.