有向グラフ内に1つのサイクルインスタンスを与えるアルゴリズムが必要です。誰かが私に方向性を示すことができますか?擬似コードで、または好ましくはRubyで?有向グラフのサイクルの例を与える
私は先にa similar questionと尋ねてきましたが、そこに提案されているとおり、グラフにサイクルがあるかどうかを検出するKahnのアルゴリズムをRubyに実装しましたが、サイクルがあるかどうかだけでなく、
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]]
私は検査の終了時に上記のコードで出力する変数た場合、それは与える:
#=> [[2, 3], [3, 4], [3, 5], [3, 6], [6, 2]]
を私が欲しいのサイクルを含み、それはまた、サイクルとは無関係であり、余分なエッジを含み。