有向グラフにサイクルのインスタンスがあれば、それを与えるアルゴリズムが必要です。誰か私に方向性を教えてもらえますか?擬似コードで、またはできればRubyで?
以前に同様の質問をし、そこでの提案に従って、グラフにサイクルがあるかどうかを検出するカーンのアルゴリズムをRubyに実装しましたが、サイクルがあるかどうかだけでなく、そのようなサイクルの1つの可能なインスタンスも必要です。
example_graph = [[1, 2], [2, 3], [3, 4], [3, 5], [3, 6], [6, 2]]
カーンのアルゴリズム
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
上記のアルゴリズムは、グラフにサイクルがあるかどうかを示します。
cyclic?(example_graph) #=> true
しかし、それだけでなく、次のようなサイクルの例も必要です。
#=> [[2, 3], [3, 6], [6, 2]]
検査の最後に上記のコードで変数を出力するgraph
と、次のようになります。
#=> [[2, 3], [3, 4], [3, 5], [3, 6], [6, 2]]
これには、必要なサイクルが含まれますが、サイクルに関係のない余分なエッジも含まれます。