Erlang Thursday – digraph:add_edge/4

今天的Erlang Thursday讲的是 digraph:add_edge/4.

digraph:add_edge/4 第一个入参是一个有向图,第二个入参是原节点(发出节点),第三个入参是目标节点(接收节点),最后一个入参是一个标签。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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]]

digraph模块也有 digraph:add_edge/5 函数,它允许你指定边的标识符,下面的例子我给一条边的标识符是 myEdge 。

1
2
3
4
digraph:add_edge(Graph, myEdge, Vertex2, Vertex1, myLabel).
% myEdge
digraph:edges(Graph).
% [['$e'|1],['$e'|2],['$e'|3],myEdge,['$e'|0]]

另外 digraph:add_edge/3 函数则允许你不指定边或者标签。

1
2
3
4
5
6
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]]

如果你注意到上述的 digraph:add_edge/3 和 digraph:add_edge/5 函数的例子中,我们给同样的发出节点和接收节点增加几个边,函数都很乐意地为我们创建这些边。

我们也可以通过指定 acyclic 参数给 digraph:new/1 来创建一个无循环有向图。

1
2
3
4
5
6
7
8
9
10
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]}}

当我们想创建一条边从而在一个无循环有向图里创建一个环的时候,我们将得到一个带有指定边的 bad_edge 错误。

原文链接: https://www.proctor-it.com/erlang-thursday-digraph-add_edge-4/