Dando um exemplo de ciclo em um gráfico direcionado
Quero um algoritmo que forneça uma instância de um ciclo em um gráfico direcionado, se houver algum. Alguém pode me mostrar uma direção? Em pseudo-código, ou preferencialmente, em Ruby?
Eu perguntei anteriormenteuma pergunta semelhante, e seguindo as sugestões lá, implementei o algoritmo de Kahn em Ruby que detecta se um gráfico tem um ciclo, mas quero não apenas se ele tem um ciclo, mas também uma possível instância desse cicl
example_graph = [[1, 2], [2, 3], [3, 4], [3, 5], [3, 6], [6, 2]]
Algoritmo de Kahn
def cyclic? graph
## The set of edges that have not been examined
graph = graph.dup
n, m = graph.transpose
## The set of nodes that are the supremum in the graph
sup = (n - m).uniq
while sup_old = sup.pop do
sup_old = graph.select{|n, _| n == sup_old}
graph -= sup_old
sup_old.each {|_, ssup| sup.push(ssup) unless graph.any?{|_, n| n == ssup}}
end
!graph.empty?
end
O algoritmo acima informa se um gráfico tem um ciclo:
cyclic?(example_graph) #=> true
mas eu quero não apenas isso, mas um exemplo de ciclo como este:
#=> [[2, 3], [3, 6], [6, 2]]
Se eu fosse exibir a variávelgraph
no código acima, no final do exame, fornecerá:
#=> [[2, 3], [3, 4], [3, 5], [3, 6], [6, 2]]
que inclui o ciclo que eu quero, mas também inclui arestas extras que são irrelevantes para o cicl