Functor Persistent.Digraph.ConcreteBidirectional

module ConcreteBidirectional: 
functor (V : Sig.COMPARABLE) -> Sig.P 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.
Parameters:
V : Sig.COMPARABLE

include Sig.G

A persistent graph is a graph.
val empty : t
The empty graph.
val add_vertex : t -> vertex -> t
add_vertex g v adds the vertex v to the graph g. Just return g if v is already in g.
val remove_vertex : t -> vertex -> t
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.

Time complexity for ocamlgraph implementations: 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.

val add_edge : t -> vertex -> vertex -> t
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.
val add_edge_e : t -> edge -> t
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.
val remove_edge : t -> vertex -> vertex -> t
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.
Raises Invalid_argument if v1 or v2 are not in g.
val remove_edge_e : t -> edge -> t
remove_edge_e g e removes the edge e from the graph g. Just return g if e is not in g.
Raises Invalid_argument if E.src e or E.dst e are not in g.