查看源码 digraph (stdlib v6.2)
此模块提供带标签的有向图(“digraphs”)版本。
此模块管理的有向图存储在 ETS 表中。这意味着以下几点
- 只有创建该有向图的进程才能更新它。
- 有向图不会被垃圾回收。只有在调用
delete/1
或创建有向图的进程终止时,用于有向图的 ETS 表才会被删除。 - 有向图是一种可变的数据结构。
这里提供的图之所以不是适当的有向图,是因为允许顶点之间存在多个边。但是,这里使用的是有向图的通常定义。
有向图(或简称“digraph”)是一对 (V, E),其中 V 是 顶点的有限集合,E 是 有向边(或简称“边”)的有限集合。边的集合 E 是 V × V 的子集(V 与自身的笛卡尔积)。
在此模块中,允许 V 为空。由此获得的唯一有向图称为空有向图。顶点和边都由唯一的 Erlang 术语表示。
有向图可以用更多信息进行注释。此类信息可以附加到有向图的顶点和边。带注释的有向图称为带标签的有向图,附加到顶点或边的信息称为标签。标签是 Erlang 术语。
边 e = (v, w) 被称为从顶点 v 发出,并入射到顶点 w 上。
顶点的出度是从该顶点发出的边的数量。
顶点的入度是入射到该顶点上的边的数量。
如果一条边从 v 发出并入射到 w 上,则 w 被称为 v 的出邻居,而 v 被称为 w 的入邻居。
有向图 (V, E) 中从 v[1] 到 v[k] 的路径 P 是 V 中顶点的非空序列 v[1], v[2], ..., v[k],其中对于 1 <= i < k,存在边 (v[i],v[i+1]) 在 E 中。
路径 P 的长度是 k-1。
如果所有顶点都不同,则路径 P 是简单路径,除了第一个和最后一个顶点可以相同。
如果 P 的长度不为零且 v[1] = v[k],则路径 P 是一个环。
环路是长度为 1 的环。
简单环是既是环又是简单路径的路径。
无环有向图是没有环的有向图。
另请参阅
摘要
函数
等效于 add_edge(G, E, V1, V2, Label)
,其中 E
是创建的边。
使用空列表作为标签创建顶点,并返回创建的顶点。
使用 Label
作为顶点(新)标签,创建(或修改)有向图 G
的顶点 V
。返回新顶点 V
。
从有向图 G
中删除边 E
。
从有向图 G
中删除列表 Edges
中的边。
从有向图 G
中删除边,直到从顶点 V1
到顶点 V2
没有路径为止。
从有向图 G
中删除列表 Vertices
中的顶点。
删除有向图 G
。此调用很重要,因为有向图是用 ETS 实现的。ETS 表没有垃圾回收。但是,如果创建有向图的进程终止,则会删除该有向图。
以某种未指定的顺序返回有向图 G
的所有边的列表。
尝试查找从有向图 G
的顶点 V1
到顶点 V2
的简单路径。将路径作为顶点列表 [V1, ..., V2]
返回,如果不存在从 V1
到 V2
的长度为 1 或以上的简单路径,则返回 false
。
尝试查找从有向图 G
的顶点 V1
到顶点 V2
的尽可能短的简单路径。将路径作为顶点列表 [V1, ..., V2]
返回,如果不存在从 V1
到 V2
的长度为 1 或以上的简单路径,则返回 false
。
返回有向图 G
的顶点 V
的入度。
以某种未指定的顺序返回有向图 G
中入射到 V
上的所有边的列表。
以某种未指定的顺序返回有向图 G
中 V
的所有入邻居的列表。
返回描述有向图 G
的 {Tag, Value}
对的列表。将返回以下对
返回有向图 G
的边数。
返回有向图 G
的顶点数。
返回有向图 G
的顶点 V
的出度。
以某种未指定的顺序返回有向图 G
中从 V
发出的所有边的列表。
以某种未指定的顺序返回有向图 G
中 V
的所有出邻居的列表。
返回 {V, Label}
,其中 Label
是有向图 G
的顶点 V
的标签,如果不存在有向图 G
的顶点 V
,则返回 false
。
返回有向图 G
的所有顶点的列表,顺序未指定。
类型
当无法向图中添加边时的错误原因。
如果该边会在无环有向图中创建一个环,则返回 {error, {bad_edge, Path}}
。如果 G
已经存在一个值 E
的边连接不同的顶点对,则返回 {error, {bad_edge, [V1, V2]}}
。如果 V1
或 V2
中的任何一个不是有向图 G
的顶点,则返回 {error, {bad_vertex,
V}}
,其中 V = V1
或 V = V2
。
-type d_cyclicity() :: acyclic | cyclic.
-type d_protection() :: private | protected.
-type d_type() :: d_cyclicity() | d_protection().
-type edge() :: term().
充当边的标识符或“名称”。这与边的“标签”不同,后者将辅助信息附加到边,而不是标识边本身。
-opaque graph()
由 new/0,1
返回的有向图。
-type label() :: term().
-type vertex() :: term().
函数
-spec add_edge(G, V1, V2) -> edge() | {error, add_edge_err_rsn()} when G :: graph(), V1 :: vertex(), V2 :: vertex().
-spec add_edge(G, V1, V2, Label) -> edge() | {error, add_edge_err_rsn()} when G :: graph(), V1 :: vertex(), V2 :: vertex(), Label :: label().
等效于 add_edge(G, E, V1, V2, Label)
,其中 E
是创建的边。
创建的边由项 ['$e' | N]
表示,其中 N
是一个整数 >= 0。
有关可能出现的错误的详细信息,请参阅add_edge_err_rsn/0
。
-spec add_edge(G, E, V1, V2, Label) -> edge() | {error, add_edge_err_rsn()} when G :: graph(), E :: edge(), V1 :: vertex(), V2 :: vertex(), Label :: label().
使用 Label
作为边的(新)标签,创建(或修改)有向图 G
中标识符为 E
的边。该边从 V1
发出并入射到 V2
上。返回 E
。
有关可能出现的错误的详细信息,请参阅add_edge_err_rsn/0
。
使用空列表作为标签创建顶点,并返回创建的顶点。
创建的顶点由项 ['$v' | N]
表示,其中 N
是一个整数 >= 0。
等效于 add_vertex(G, V, [])
。
使用 Label
作为顶点(新)标签,创建(或修改)有向图 G
的顶点 V
。返回新顶点 V
。
从有向图 G
中删除边 E
。
从有向图 G
中删除列表 Edges
中的边。
从有向图 G
中删除边,直到从顶点 V1
到顶点 V2
没有路径为止。
所采用的过程的草图
从有向图 G
中删除列表 Vertices
中的顶点。
-spec delete(G) -> true when G :: graph().
删除有向图 G
。此调用很重要,因为有向图是用 ETS 实现的。ETS 表没有垃圾回收。但是,如果创建有向图的进程终止,则会删除该有向图。
-spec edge(G, E) -> {E, V1, V2, Label} | false when G :: graph(), E :: edge(), V1 :: vertex(), V2 :: vertex(), Label :: label().
返回 {E, V1, V2, Label}
,其中 Label
是有向图 G
中从 V1
发出并入射到 V2
上的边 E
的标签。如果不存在有向图 G
的边 E
,则返回 false
。
以某种未指定的顺序返回有向图 G
的所有边的列表。
-spec get_cycle(G, V) -> Vertices | false when G :: graph(), V :: vertex(), Vertices :: [vertex(), ...].
如果存在通过顶点 V
的长度为 2 或以上的简单环,则该环将作为顶点列表 [V, ..., V]
返回。如果存在通过 V
的环路,则该环路将作为列表 [V]
返回。如果不存在通过 V
的环路,则返回 false
。
get_path/3
用于查找通过 V
的简单环。
-spec get_path(G, V1, V2) -> Vertices | false when G :: graph(), V1 :: vertex(), V2 :: vertex(), Vertices :: [vertex(), ...].
尝试查找从有向图 G
的顶点 V1
到顶点 V2
的简单路径。将路径作为顶点列表 [V1, ..., V2]
返回,如果不存在从 V1
到 V2
的长度为 1 或以上的简单路径,则返回 false
。
有向图 G
以深度优先的方式遍历,并返回找到的第一条路径。
-spec get_short_cycle(G, V) -> Vertices | false when G :: graph(), V :: vertex(), Vertices :: [vertex(), ...].
尝试查找通过有向图 G
的顶点 V
的尽可能短的简单环。将该环作为顶点列表 [V, ..., V]
返回,如果不存在通过 V
的简单环,则返回 false
。请注意,通过 V
的环路将作为列表 [V, V]
返回。
get_short_path/3
用于查找通过 V
的简单环。
-spec get_short_path(G, V1, V2) -> Vertices | false when G :: graph(), V1 :: vertex(), V2 :: vertex(), Vertices :: [vertex(), ...].
尝试查找从有向图 G
的顶点 V1
到顶点 V2
的尽可能短的简单路径。将路径作为顶点列表 [V1, ..., V2]
返回,如果不存在从 V1
到 V2
的长度为 1 或以上的简单路径,则返回 false
。
有向图 G
以广度优先的方式遍历,并返回找到的第一条路径。
-spec in_degree(G, V) -> non_neg_integer() when G :: graph(), V :: vertex().
返回有向图 G
的顶点 V
的入度。
以某种未指定的顺序返回有向图 G
中入射到 V
上的所有边的列表。
以某种未指定的顺序返回有向图 G
中 V
的所有入邻居的列表。
-spec info(G) -> InfoList when G :: graph(), InfoList :: [{cyclicity, Cyclicity :: d_cyclicity()} | {memory, NoWords :: non_neg_integer()} | {protection, Protection :: d_protection()}].
返回描述有向图 G
的 {Tag, Value}
对的列表。将返回以下对
{cyclicity, Cyclicity}
,其中Cyclicity
是cyclic
或acyclic
,取决于给new
的选项。{memory, NoWords}
,其中NoWords
是分配给 ETS 表的字数。{protection, Protection}
,其中Protection
是protected
或private
,取决于给new
的选项。
-spec new() -> graph().
等效于 new([])
。
根据 Type
中的选项返回一个具有属性的空有向图
如果指定了无法识别的类型选项 T
,或者 Type
不是一个正确的列表,则会引发 badarg
异常。
-spec no_edges(G) -> non_neg_integer() when G :: graph().
返回有向图 G
的边数。
-spec no_vertices(G) -> non_neg_integer() when G :: graph().
返回有向图 G
的顶点数。
-spec out_degree(G, V) -> non_neg_integer() when G :: graph(), V :: vertex().
返回有向图 G
的顶点 V
的出度。
以某种未指定的顺序返回有向图 G
中从 V
发出的所有边的列表。
以某种未指定的顺序返回有向图 G
中 V
的所有出邻居的列表。
返回 {V, Label}
,其中 Label
是有向图 G
的顶点 V
的标签,如果不存在有向图 G
的顶点 V
,则返回 false
。
返回有向图 G
的所有顶点的列表,顺序未指定。