lib/rgl/topsort.rb in rgl-0.4.0 vs lib/rgl/topsort.rb in rgl-0.5.0

- old
+ new

@@ -1,31 +1,31 @@ # topsort.rb -require 'rgl/traversal' +require 'rgl/graph_iterator' module RGL # Topological Sort Iterator # # The topological sort algorithm creates a linear ordering of the vertices # such that if edge (u,v) appears in the graph, then u comes before v in # the ordering. The graph must be a directed acyclic graph (DAG). # # The iterator can also be applied to undirected graph or to a DG graph - # which contains a cycle. In this case, the Iterator does not reach all - # vertices. The implementation of acyclic? uses this fact. - + # which contains a cycle. In this case, the Iterator does not reach all + # vertices. The implementation of acyclic? uses this fact. + # class TopsortIterator include GraphIterator - def initialize (g) + def initialize(g) super(g) set_to_begin end - def set_to_begin # :nodoc: + def set_to_begin # :nodoc: @waiting = Array.new @inDegrees = Hash.new(0) graph.each_vertex do |u| @inDegrees[u] = 0 unless @inDegrees.has_key?(u) @@ -37,36 +37,43 @@ @inDegrees.each_pair do |v, indegree| @waiting.push(v) if indegree.zero? end end - def basic_forward # :nodoc: + def basic_forward # :nodoc: u = @waiting.pop graph.each_adjacent(u) do |v| @inDegrees[v] -= 1 @waiting.push(v) if @inDegrees[v].zero? end u end - def at_beginning?; true; end # :nodoc: FIXME - def at_end?; @waiting.empty?; end # :nodoc: + def at_beginning? + true + end - end # class TopsortIterator + # :nodoc: FIXME + def at_end? + @waiting.empty? + end # :nodoc: + end # class TopsortIterator + module Graph # Returns a TopsortIterator. - + # def topsort_iterator TopsortIterator.new(self) end - - # Returns true if the graph contains no cycles. This is only meaningful - # for directed graphs. Returns false for undirected graphs. + # Returns true if the graph contains no cycles. This is only meaningful + # for directed graphs. Returns false for undirected graphs. + # def acyclic? topsort_iterator.length == num_vertices end - end # module Graph -end # module RGL + end # module Graph + +end # module RGL