¿Mi gráfico es elegante?

8

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

Gráfico simple

Probemos el siguiente etiquetado:

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.

Doblemente etiquetado

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 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
Ad Hoc Garf Hunter
fuente
Creo que los algoritmos para verificar la gracia solo se conocen para ciertas clases de gráficos (por ejemplo, árboles )
ngenisis
2
@ngenisis Ciertamente puede ser forzado por la fuerza bruta. Existen algoritmos más eficientes para ciertas clases, pero puede usar restricciones en los tamaños de los bordes para crear una diferencia máxima de etiqueta de nodo.
Ad Hoc Garf Hunter
[(0,1),(1,2),(2,3),(3,4)]es probablemente un caso marginal notable.
Dennis
A menos que me falte algo, los gráficos de la forma {(k-1,k) : 0 < k < n}requieren las etiquetas más altas de todos los gráficos con el mismo número de nodos.
Dennis
@ Dennis Oh, sí. Eso es ciertamente cierto que deberían requerir n(n+1)/2como su etiqueta más alta. He añadido tu caso de prueba.
Ad Hoc Garf Hunter

Respuestas:

6

Jalea , 12 bytes

FSŒ!ị@€ḅ-AċJ

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

FSŒ!ị@€ḅ-AċJ  Main link. Argument: A (array of pairs)

FS            Flatten and sum, yielding s. This is an upper bound for the labels
              a graceful labeling (if one exists) would require.
  Œ!          Take all permutations of [1, ..., s].
      €       For each permutation P:
    ị@          Replace each integer in A with the element of P at that index.
       ḅ-     Convert all pairs from base -1 to integer, mapping (a,b) to b-a.
         A    Take absolute values.
           J  Yield the indices of A, i.e., [1, ..., len(A)].
          ċ   Count the occurrences of [1, ..., len(A)] in the result to the left.
Dennis
fuente
2
ḅ-es uno de mis trucos favoritos de Jelly :-)
ETHproductions
4

Mathematica, 121116 bytes

Editar: Guardado 5 bytes gracias a JungHwan Min y Martin Ender

Cases[Range[1+Tr[n=Range@Length[e=EdgeList@#]]]~Tuples~VertexCount@#,w_/;Sort[Abs[#-#2]&@@w[[List@@#]]&/@e]==n]!={}&

Explicación

ingrese la descripción de la imagen aquí

Función pura que toma un Graphobjeto de Mathematica con vértices {1, 2, ..., k}para algún entero no negativo k. En el peor de los casos, solo necesitaremos etiquetas de vértice que vayan de 1a 1 + (1 + 2 + ... EdgeCount@#). Como nos ahorra algunos bytes más adelante, dejaremos ela lista de aristas y nla lista {1, 2, ..., EdgeCount@#}, de modo que se extraerán los pesos de los vértices Range[1+Tr[n=Range@Length[e=EdgeList@#]]]. Generamos una lista de todas las Tupleslongitudes VertexCount@#, luego elegimos las Casesque dan etiquetas elegantes y verificamos que el resultado esté Unequalen la lista vacía {}. La gracia de la lista de pesos de vértices wse verifica haciendo Mapping a la función Abs[#-#2]&@@w[[List@@#]]&sobre la lista de aristas e, Sortregistrando el resultado y verificando si el resultado esEquala n. Aquí hay un desglose de esa función:

               List@@#     Replace the Head of the edge with List; i.e., UndirectedEdge[a,b] becomes {a,b}.
            w[[       ]]&  Select the corresponding vertex weights from the list w.
          @@               Replace the Head of that expression (List) with the function
Abs[#-#2]&                   which returns the absolute difference between its first two arguments.
                           This effectively passes the vertex weights into the absolute difference function. 
ngenisis
fuente
1
guardar un byte jugando con cierta precedencia: VertexCount[#]->VertexCount@#
JungHwan Min
1
Por cierto, el Trtruco para Lengthya 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í como Tr@Range@EdgeCount@#(y luego reemplazarlo eal final con EdgeList@#. Segundo, el operador de función rara vez guarda bytes, en este caso creo que es más corto de usar en Caseslugar de Selecty luego en w_/;lugar de w.
Martin Ender