我想要一种算法,如果有的话,它会在有向图中给出一个循环实例。谁能告诉我一个方向?在伪代码中,或者最好是在 Ruby 中?
我之前问过一个类似的问题,并按照那里的建议,我在 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]]
如果我在检查结束时输出上述代码中的变量graph
,它将给出:
#=> [[2, 3], [3, 4], [3, 5], [3, 6], [6, 2]]
其中包括我想要的循环,但它也包括与循环无关的额外边缘。