S.Concrete
Persistent Unlabeled Graphs.
module V : Sig.COMPARABLE
A persistent graph is a graph.
include Sig.G with type V.t = V.t with type V.label = V.t with type E.t = V.t * V.t with type E.label = unit
Vertices have type V.t
and are labeled with type V.label
(note that an implementation may identify the vertex with its label)
type vertex = V.t
Edges have type E.t
and are labeled with type E.label
. src
(resp. dst
) returns the origin (resp. the destination) of a given edge.
type edge = E.t
val is_empty : t -> bool
val nb_vertex : t -> int
val nb_edges : t -> int
Degree of a vertex
find_edge g v1 v2
returns the edge from v1
to v2
if it exists. Unspecified behaviour if g
has several edges from v1
to v2
.
find_all_edges g v1 v2
returns all the edges from v1
to v2
.
You should better use iterators on successors/predecessors (see Section "Vertex iterators").
Labeled edges going from/to a vertex
Iter on all edges of a graph. Edge label is ignored.
Fold on all edges of a graph. Edge label is ignored.
Each iterator iterator f v g
iters f
to the successors/predecessors of v
in the graph g
and raises Invalid_argument
if v
is not in g
. It is the same for functions fold_*
which use an additional accumulator.
<b>Time complexity for ocamlgraph implementations:</b> operations on successors are in O(1) amortized for imperative graphs and in O(ln(|V|)) for persistent graphs while operations on predecessors are in O(max(|V|,|E|)) for imperative graphs and in O(max(|V|,|E|)*ln|V|) for persistent graphs.
iter/fold on all successors/predecessors of a vertex.
iter/fold on all edges going from/to a vertex.
val empty : t
The empty graph.
add_vertex g v
adds the vertex v
to the graph g
. Just return g
if v
is already in g
.
remove g v
removes the vertex v
from the graph g
(and all the edges going from v
in g
). Just return g
if v
is not in g
.
<b>Time complexity for ocamlgraph implementations:</b> O(|V|*ln(|V|)) for unlabeled graphs and O(|V|*max(ln(|V|),D)) for labeled graphs. D is the maximal degree of the graph.
add_edge g v1 v2
adds an edge from the vertex v1
to the vertex v2
in the graph g
. Add also v1
(resp. v2
) in g
if v1
(resp. v2
) is not in g
. Just return g
if this edge is already in g
.
add_edge_e g e
adds the edge e
in the graph g
. Add also E.src e
(resp. E.dst e
) in g
if E.src e
(resp. E.dst
e
) is not in g
. Just return g
if e
is already in g
.
remove_edge g v1 v2
removes the edge going from v1
to v2
from the graph g
. If the graph is labelled, all the edges going from v1
to v2
are removed from g
. Just return g
if this edge is not in g
.