module Dfs:
Parameters: |
|
val iter : ?pre:(G.V.t -> unit) -> ?post:(G.V.t -> unit) -> Traverse.G.t -> unit
iter pre post g
visits all nodes of g
in depth-first search,
applying pre
to each visited node before its successors,
and post
after them. Each node is visited exactly once.
Not tail-recursive.val prefix : (G.V.t -> unit) -> Traverse.G.t -> unit
iter
and is tail-recursive.val postfix : (G.V.t -> unit) -> Traverse.G.t -> unit
prefix_component
is tail-recursive)val iter_component : ?pre:(G.V.t -> unit) ->
?post:(G.V.t -> unit) -> Traverse.G.t -> G.V.t -> unit
val prefix_component : (G.V.t -> unit) -> Traverse.G.t -> G.V.t -> unit
val postfix_component : (G.V.t -> unit) -> Traverse.G.t -> G.V.t -> unit
val fold : (G.V.t -> 'a -> 'a) -> 'a -> Traverse.G.t -> 'a
val fold_component : (G.V.t -> 'a -> 'a) -> 'a -> Traverse.G.t -> G.V.t -> 'a
This is a variant of the iterators above where you can move on
step by step. The abstract type iterator
represents the current
state of the iteration. The step
function returns the next state.
In each state, function get
returns the currently visited vertex.
On the final state both get
and step
raises exception Exit
.
Note: the iterator type is persistent (i.e. is not modified by the
step
function) and thus can be used in backtracking algorithms.
type
iterator
val start : Traverse.G.t -> iterator
val step : iterator -> iterator
val get : iterator -> G.V.t
val has_cycle : Traverse.G.t -> bool
has_cycle g
checks for a cycle in g
. Linear in time and space.