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)/2como 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
Graphobjeto 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 de1a1 + (1 + 2 + ... EdgeCount@#). Como nos ahorra algunos bytes más adelante, dejaremosela lista de aristas ynla 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 lasTupleslongitudesVertexCount@#, luego elegimos lasCasesque dan etiquetas elegantes y verificamos que el resultado estéUnequalen la lista vacía{}. La gracia de la lista de pesos de vérticeswse verifica haciendoMapping a la funciónAbs[#-#2]&@@w[[List@@#]]&sobre la lista de aristase,Sortregistrando el resultado y verificando si el resultado esEqualan. Aquí hay un desglose de esa función:fuente
VertexCount[#]->VertexCount@#Trtruco paraLengthya 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 reemplazarloeal final conEdgeList@#. Segundo, el operador de función rara vez guarda bytes, en este caso creo que es más corto de usar enCaseslugar deSelecty luego enw_/;lugar dew.