Skip to content
class method

TSort.each_strongly_connected_component_from

[T] (T node, ::TSort::_EachChild[T] each_child, ?untyped id_map, ?untyped stack) { (::Array[T]) -> void } -> void
[T] (T node, ::TSort::_EachChild[T] each_child, ?untyped id_map, ?untyped stack) -> ::Enumerator[::Array[T], void]
[T] (T node, ^(T) { (T) -> void } -> void each_child, ?untyped id_map, ?untyped stack) { (::Array[T]) -> void } -> void
[T] (T node, ^(T) { (T) -> void } -> void each_child, ?untyped id_map, ?untyped stack) -> ::Enumerator[::Array[T], void]
each_strongly_connected_component_from(node, each_child, id_map={}, stack=[]) { |nodes| ... }

Iterates over strongly connected components in a graph. The graph is represented by node and each_child.

node is the first node. each_child should have call method which takes a node argument and yields for each child node.

Return value is unspecified.

TSort.each_strongly_connected_component_from is a class method and it doesn’t need a class to represent a graph which includes TSort.

Example
graph = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
each_child = lambda {|n, &b| graph[n].each(&b) }
TSort.each_strongly_connected_component_from(1, each_child) {|scc|
  p scc
}
#=> [4]
#   [2, 3]
#   [1]