我想要一個算法,如果有的話在有向圖中給出一個循環的一個實例。任何人都可以告訴我一個方向?在僞代碼中,或者最好在Ruby中?在有向圖中給出一個循環的例子
我以前問過a similar question,並且按照那裏的建議,我在Ruby中實現了Kahn的算法,它檢測一個圖是否有一個循環,但我不僅想要它是否有循環,而且還想要這樣循環的一個可能的實例。
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]]
,其中包括我想要的週期,但它也包括額外的邊緣不相關的週期。