module Digraph:`sig`

..`end`

Imperative Directed Graphs.

`include Imperative.S`

Bidirectional graphs use more memory space (at worse the double) that
standard concrete directional graphs. But accessing predecessors is in
O(1) amortized instead of O(max(|V|,|E|)) and removing a vertex is in
O(D*ln(D)) instead of O(|V|*ln(D)). D is the maximal degree of the
graph.

module ConcreteBidirectional:`functor (`

`V`

`:`

`Sig.COMPARABLE`

`) ->`

`Sig.I`

`with type V.t = V.t and type V.label = V.t and type E.t = V.t * V.t and type E.label = unit`

Imperative Unlabeled, bidirectional graph.

module ConcreteBidirectionalLabeled:`functor (`

`V`

`:`

`Sig.COMPARABLE`

`) ->`

`functor (`

`E`

`:`

`Sig.ORDERED_TYPE_DFT`

`) ->`

`Sig.I`

`with type V.t = V.t and type V.label = V.t and type E.t = V.t * E.t * V.t and type E.label = E.t`

Imperative Labeled and bidirectional graph.