Today’s Erlang Thursday is on digraph:add_edge/4.
digraph:add_edge/4
takes a graph as its first argument, the originating (eminating) vertex as its second arugment, the destination (incident) vertex as its third argument, and a label.
Graph = digraph:new(). % {digraph,20498,24595,28692,true} Vertex1 = digraph:add_vertex(Graph, foo). % foo Vertex2 = digraph:add_vertex(Graph, bar). % bar Edge1 = digraph:add_edge(Graph, Vertex1, Vertex2, {foo, bar}). % ['$e'|0] digraph:edges(Graph). % [['$e'|0]] Edge2 = digraph:add_edge(Graph, Vertex2, Vertex1, {bar, foo}). % ['$e'|1] digraph:edges(Graph). % [['$e'|1],['$e'|0]]
The digraph
module also contains digraph:add_edge/5
which allows you to specify the edge identifier, in this case we want the edge to be myEdge
.
digraph:add_edge(Graph, myEdge, Vertex2, Vertex1, myLabel). % myEdge digraph:edges(Graph). % [['$e'|1],['$e'|2],['$e'|3],myEdge,['$e'|0]]
As well as digraph:add_edge/3
which allows you to not specify the edge or the label.
digraph:add_edge(Graph, Vertex2, Vertex1). % ['$e'|2] digraph:add_edge(Graph, Vertex2, Vertex1). % ['$e'|3] digraph:edges(Graph). % [['$e'|1],['$e'|2],['$e'|3],['$e'|0]]
And if you note in the examples for digraph:add_edge/3
and digraph:add_edge/5
we added a number of edges with the same eminate and incident vertices, and it was happy to create those edges for us.
We can also create acyclic digraphs by using digraph:new/1
, and specifying that we want the digraph()
to be acyclic
.
Graph2 = digraph:new([acyclic]). % {digraph,20498,24595,28692,false} VertexA = digraph:add_vertex(Graph2, foo). % foo VertexB = digraph:add_vertex(Graph2, bar). % bar EdgeAB = digraph:add_edge(Graph2, VertexA, VertexB, {foo, bar}). % ['$e'|0] EdgeBA = digraph:add_edge(Graph2, VertexB, VertexA, {bar, foo}). % {error,{bad_edge,[foo,bar]}}
When we try to add an edge that will create a cycle in an acyclic directed graph, we get a return of a bad_edge
error with the two edges specified.
–Proctor