Dois vértices distintos em um gráfico direcionado estão fortemente conectados se houver um caminho no gráfico entre eles. Um componente fortemente conectado do gráfico é um subconjunto do gráfico, de modo que cada par de vértices distintos no subconjunto esteja fortemente conectado e a adição de mais vértices ao subconjunto quebraria essa propriedade.
Seu desafio é separar um gráfico em seus componentes fortemente conectados. Especificamente, você deve gerar todos os SCCs no gráfico.
E / S:
Como entrada, você pode usar uma lista de arestas direcionadas, uma lista de adjacências, uma matriz de adjacências ou qualquer outro formato de entrada razoável. Pergunte se você não tem certeza. Você pode assumir que o gráfico não possui vértices totalmente desconectados e que não existem arestas próprias, mas não pode fazer outras suposições. Você também pode opcionalmente levar a lista de vértices como entrada, bem como o número de vértices.
Como saída, você deve fornecer um particionamento dos vértices, como uma lista de listas de vértices, em que cada sub-lista é um componente fortemente conectado ou uma rotulagem de vértices, em que cada rótulo corresponde a um componente diferente.
Se você usar um rótulo, os rótulos deverão ser vértices ou uma sequência consecutiva de números inteiros. Isso evita que o cálculo seja desviado para os rótulos.
Exemplos:
Esses exemplos usam listas de arestas, em que cada aresta é direcionada da 1ª entrada para a segunda entrada e partições de saída. Você é livre para usar este formato ou outro.
A entrada está na primeira linha, a saída está na segunda linha.
[[1, 2], [2, 3], [3, 1], [1, 4]]
[[1, 2, 3], [4]]
[[1, 2], [2, 3], [3, 4]]
[[1], [2], [3], [4]]
[[1, 2], [2, 1], [1, 3], [2, 4], [4, 2], [4, 3]]
[[1, 2, 4], [3]]
[[1, 2], [2, 3], [2, 5], [2, 6], [3, 4], [3, 7], [4, 3], [4, 8], [5, 1], [5, 6], [6, 7], [7, 6], [8, 7], [8, 4]]
[[1, 2, 5], [3, 4, 8], [6, 7]]
Pontuação e restrições:
As brechas padrão são proibidas, como sempre. Além disso, os componentes internos que lidam especificamente com componentes fortemente conectados são banidos.
As soluções devem ser executadas em não mais de uma hora nos exemplos fornecidos. (Isso visa impedir soluções exponenciais lentas e nada mais.)
Isso é código de golfe. Menos bytes ganha.
8
não está em um componente [3,4]
porque ele não pode apenas cada um 6
e 7
(nenhum dos quais pode alcançá-lo).