El objetivo de este desafío se le da un gráfico acíclico dirigido finito (DAG), determinar si el gráfico es una reducción transitiva .
Una breve explicación de lo que son un DAG y reducciones transitivas:
Un DAG es un gráfico con bordes dirigidos (es decir, solo puede viajar en una dirección en ese borde) de modo que dado cualquier nodo inicial en el gráfico, es imposible volver al nodo inicial (es decir, no hay ciclos).
Dado cualquier nodo inicial, si es posible viajar a otro nodo final en el gráfico a través de cualquier número positivo arbitrario de bordes, entonces ese nodo final se define como accesible desde el nodo inicial. En un DAG general, puede haber múltiples rutas que pueden tomarse desde un nodo inicial a un nodo final objetivo. Por ejemplo, tome este gráfico de diamantes:
Para llegar al nodo D
de A
, usted podría tomar el camino A->B->D
o A->C->D
. Por lo tanto, D
es accesible desde A
. Sin embargo, no hay una ruta que se pueda tomar para llegar al nodo B
comenzando desde el nodo C
. Por lo tanto, el nodo B
no es accesible desde el nodo C
.
Defina la accesibilidad del gráfico como la lista de nodos accesibles para cada nodo inicial en el gráfico. Entonces, para el mismo ejemplo de gráfico de diamante, la accesibilidad es:
A: [B, C, D]
B: [D]
C: [D]
D: []
A continuación se muestra otro gráfico que tiene la misma accesibilidad que el gráfico anterior:
Sin embargo, este segundo gráfico tiene más aristas que el gráfico original. La reducción transitiva de un gráfico es un gráfico con el menor número de aristas y la misma accesibilidad del gráfico original. Entonces, el primer gráfico es la reducción transitiva del segundo.
Para un DAG finito, se garantiza que la reducción transitiva existe y es única.
Entrada
La entrada es una "lista de listas", donde la lista externa tiene la longitud del número de vértices, y cada lista interna es la longitud del número de bordes que salen del nodo asociado y contiene los índices de los nodos de destino. Por ejemplo, una forma de describir el primer gráfico anterior sería (suponiendo una indexación basada en cero):
[[1, 2], [3], [3], []]
Puede comenzar a indexar el primer nodo en cualquier valor entero arbitrario (por ejemplo, indexación basada en 0 o 1).
La entrada puede provenir de cualquier fuente de entrada deseada (stdio, parámetro de función, etc.). Usted es libre de elegir el formato de entrada exacto siempre que no se proporcione información adicional. Por ejemplo, si desea tomar la entrada de stdio, puede hacer que cada línea sea una lista de bordes para el nodo asociado. Ex.:
1 2
3
3
'' (blank line)
Los índices en cada lista de adyacencia no están necesariamente ordenados, y podría haber múltiples bordes conectando dos nodos (ej .:) [[1,1],[]]
. Puede suponer que el gráfico de entrada está débilmente conectado y no contiene ciclos (es decir, es un DAG).
Salida
La salida es verdadera si el DAG de entrada dado es una reducción transitiva, y un valor falso de lo contrario. Esto puede ser para cualquier sumidero deseado (stdio, valor de retorno, parámetro de salida, etc.)
Ejemplos
Todos los ejemplos usan indexación basada en 0.
[[1,2],[3],[3],[]]
true
[[1,2,3],[3],[3],[]]
false
[[1,1],[]]
false
[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[1,3],[2],[3],[]]
false
Puntuación
Este es el código de golf; el código más pequeño en bytes gana. Su código debe completarse en un período de tiempo razonable (10 minutos como máximo en cualquier hardware que tenga). Se aplican lagunas estándar. Puede usar los complementos deseados.