O objetivo deste desafio é fornecer um gráfico acíclico direcionado finito (DAG), determinar se o gráfico é uma redução transitiva .
Uma breve explicação do que são DAG e reduções transitivas:
Um DAG é um gráfico com arestas direcionadas (ou seja, você só pode viajar em uma direção nessa aresta), de modo que, dado qualquer nó inicial no gráfico, é impossível retornar ao nó inicial (ou seja, não há ciclos).
Dado qualquer nó inicial, se for possível viajar para outro nó final no gráfico por meio de qualquer número positivo arbitrário de arestas, esse nó final é definido como acessível a partir do nó inicial. Em um DAG geral, pode haver vários caminhos que podem ser tomados de um nó inicial para um nó final de destino. Por exemplo, veja este gráfico de diamante:
Para chegar ao nó D
de A
, você pode pegar o caminho A->B->D
ou A->C->D
. Assim, D
é acessível a partir de A
. No entanto, não há um caminho que possa ser seguido para chegar ao nó B
iniciando no nó C
. Assim, o nó B
não está acessível a partir do nó C
.
Defina a acessibilidade do gráfico como a lista de nós alcançáveis para cada nó inicial no gráfico. Portanto, para o mesmo exemplo de gráfico de diamante, a acessibilidade é:
A: [B, C, D]
B: [D]
C: [D]
D: []
Outro gráfico que tem a mesma acessibilidade que o gráfico acima é mostrado abaixo:
No entanto, este segundo gráfico possui mais arestas que o gráfico original. A redução transitiva de um gráfico é um gráfico com o menor número de arestas e a mesma acessibilidade do gráfico original. Portanto, o primeiro gráfico é a redução transitiva do segundo.
Para um DAG finito, a redução transitiva é garantida e é única.
Entrada
A entrada é uma "lista de listas", em que a lista externa possui o comprimento do número de vértices e cada lista interna é o comprimento do número de arestas que saem do nó associado e contém os índices dos nós de destino. Por exemplo, uma maneira de descrever o primeiro gráfico acima seria (assumindo a indexação baseada em zero):
[[1, 2], [3], [3], []]
Você pode começar a indexação do primeiro nó em qualquer valor inteiro arbitrário (por exemplo, indexação baseada em 0 ou 1).
A entrada pode vir de qualquer fonte de entrada desejada (stdio, parâmetro de função, etc.). Você pode escolher o formato exato de entrada, desde que nenhuma informação adicional seja fornecida. Por exemplo, se você deseja receber a entrada do stdio, cada linha pode ser uma lista de arestas para o nó associado. Ex.:
1 2
3
3
'' (blank line)
Os índices em cada lista de adjacência não são necessariamente classificados e pode haver várias arestas conectando dois nós (ex .:) [[1,1],[]]
. Você pode assumir que o gráfico de entrada está fracamente conectado e não contém ciclos (ou seja, é um DAG).
Resultado
A saída é verdadeira se a entrada DAG fornecida for uma redução transitiva e, caso contrário, um valor falso. Pode ser em qualquer coletor desejado (stdio, valor de retorno, parâmetro de saída, etc.)
Exemplos
Todos os exemplos usam indexação baseada em 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
Pontuação
Isso é código de golfe; o menor código em bytes vence. Seu código deve ser concluído em um período de tempo razoável (10 minutos no máximo em qualquer hardware que você tenha). Aplicam-se brechas padrão. Você pode usar quaisquer embutidos desejados.