Para un DAG dado (gráfico acíclico dirigido), cada uno de sus tipos topológicos es una permutación de todos los vértices, donde para cada borde (u, v) en el DAG, u aparece antes de v en la permutación.
Su tarea es calcular el número total de tipos topológicos de un DAG dado.
Reglas
- Puede usar cualquier formato para representar el gráfico, como la matriz de adyacencia, la lista de adyacencia o la lista de bordes, siempre que no realice cálculos útiles en su codificación. También puede tener cosas como conteo de vértices o lista de vértices en la entrada, si son útiles.
- Puede suponer que el gráfico en la entrada siempre es un DAG (no tiene ningún ciclo).
- Su programa debería funcionar en teoría para cualquier entrada. Pero puede fallar si desborda el tipo entero básico en su idioma.
- Los nombres de vértices pueden ser cualquier valor consecutivo en cualquier tipo. Por ejemplo: números que comienzan en 0 o 1. (Y solo si no está almacenando código en este número, por supuesto).
- Este es el código de golf. El código más corto gana.
Ejemplo
Esta es la misma entrada en diferentes formatos. Su programa no tiene que aceptarlos todos. Los vértices son siempre enteros comenzando en 0.
Adjacency list:
[ [1 2 3 5] [2 4] [] [2] [] [3] ]
Adjacency matrix:
[ [0 1 1 1 0 1] [0 0 1 0 1 0] [0 0 0 0 0 0] [0 0 1 0 0 0] [0 0 0 0 0 0] [0 0 0 1 0 0] ]
Edge list:
6 [ [0 1] [0 2] [0 3] [0 5] [1 2] [1 4] [3 2] [5 3] ]
Es el gráfico que se muestra en esta imagen:
La salida debe ser:
9
Los tipos topológicos son:
[0 1 4 5 3 2]
[0 1 5 4 3 2]
[0 1 5 3 4 2]
[0 1 5 3 2 4]
[0 5 1 4 3 2]
[0 5 1 3 4 2]
[0 5 1 3 2 4]
[0 5 3 1 4 2]
[0 5 3 1 2 4]
code-golf
combinatorics
graph-theory
permutations
jimmy23013
fuente
fuente
Respuestas:
CJam - 25
Con gran ayuda de user23013 :)
Pruébalo en línea
Explicación:
El algoritmo general es el mismo que en la solución Python de xnor .
La clave aquí es el
j
operador, que hace una recursión memorable. Se necesita un parámetro, un valor o matriz para los valores iniciales (como en f (0), f (1), etc.) y un bloque para definir la recursividad. Elj
operador se usa nuevamente dentro del bloque para hacer llamadas recursivas (y memorizadas) al mismo bloque. También se puede usar con múltiples parámetros, pero no es el caso aquí.La gran innovación de user23013 es usar j con diferentes tipos de datos, haciendo uso de la lista de adyacencia como la matriz de valores iniciales.
fuente
Pitón, 58
La entrada consiste en un diccionario de adyacencia
G
y un conjunto de vérticesV
.El código es recursivo. El conjunto
V
almacena todos los nodos que aún necesitan visita. Para cada próximo nodo potencial, verificamos su idoneidad al ver si no hay vértices restantes que lo señalen, yV-G[v]==V
verificamos esoV
yG[v]
somos disjuntos. Para todos los vértices adecuados, agregamos el número de tipos topológicos eliminados. Como caso base, el conjunto vacío da 1.fuente
Mathematica,
805751 bytesImplementación muy directa de la definición. Solo estoy generando todas las permutaciones y cuento cuántas de ellas son válidas. Para verificar si una permutación es válida, obtengo todos los pares de vértices en la permutación. Convenientemente,
Subsets[l,{2}]
no solo me da todos los pares, sino que también mantiene el orden en el que se encuentranl
, justo lo que necesito.Lo anterior es una función que espera la lista de vértices y la lista de bordes, como
si se llama a la función
f
.Intentaré jugar al golf, o tal vez use otro enfoque más tarde.
fuente
Pyth, 27 bytes
Define una función 2 de entrada,
g
. La primera entrada es el número de vértices, la segunda es la lista de aristas dirigidas.Probar:
Pruébalo aquí.
fuente
^UGG
, que genera todasG
las listas de entrada derange(len(G))
.[0, 1, ...]
directamente en la entrada?^GlG
vs^UGG
.Haskell,
1021071008985 bytesLa entrada es el número de vértice más alto (comenzando con 0) y una lista de bordes, donde un borde es una lista de dos elementos. Ejemplo de uso:
5 # [[0,1], [0,2], [0,3], [0,5], [1,2], [1,4], [3,2], [5,3]]
Cómo funciona: cuente todas las permutaciones
p
de los vértices para los que[u,v]
satisfacen todos los bordes : la posición deu
inp
es menor que la posición dev
inp
. Esa es una implementación directa de la definición.Editar: mi primera versión devolvió los tipos topológicos y no cuántos hay. Arreglado.
Edición II: no funcionó para gráficos con vértices no conectados. Arreglado.
fuente