查看源码 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 的环。

  • 简单环是既是环又是简单路径的路径。

  • 无环有向图是没有环的有向图。

另请参阅

digraph_utils, ets

摘要

类型

当无法向图中添加边时的错误原因。

充当边的标识符或“名称”。这与边的“标签”不同,后者将辅助信息附加到边,而不是标识边本身。

new/0,1 返回的有向图。

函数

等效于 add_edge(G, E, V1, V2, Label),其中 E 是创建的边。

使用 Label 作为边的(新)标签,创建(或修改)有向图 G 中标识符为 E 的边。该边从 V1 发出入射V2 上。返回 E

使用空列表作为标签创建顶点,并返回创建的顶点。

使用 Label 作为顶点(新)标签,创建(或修改)有向图 G 的顶点 V。返回新顶点 V

从有向图 G 中删除边 E

从有向图 G 中删除列表 Edges 中的边。

从有向图 G 中删除边,直到从顶点 V1 到顶点 V2 没有路径为止。

从有向图 G 中删除顶点 V。任何从 V 发出入射V 上的边也会被删除。

从有向图 G 中删除列表 Vertices 中的顶点。

删除有向图 G。此调用很重要,因为有向图是用 ETS 实现的。ETS 表没有垃圾回收。但是,如果创建有向图的进程终止,则会删除该有向图。

返回 {E, V1, V2, Label},其中 Label 是有向图 G 中从 V1 发出入射V2 上的边 E标签。如果不存在有向图 G 的边 E,则返回 false

以某种未指定的顺序返回有向图 G 的所有边的列表。

以某种未指定的顺序返回有向图 G 中从 V 发出入射V 上的所有边的列表。

如果存在通过顶点 V 的长度为 2 或以上的简单环,则该环将作为顶点列表 [V, ..., V] 返回。如果存在通过 V环路,则该环路将作为列表 [V] 返回。如果不存在通过 V 的环路,则返回 false

尝试查找从有向图 G 的顶点 V1 到顶点 V2简单路径。将路径作为顶点列表 [V1, ..., V2] 返回,如果不存在从 V1V2 的长度为 1 或以上的简单路径,则返回 false

尝试查找通过有向图 G 的顶点 V 的尽可能短的简单环。将该环作为顶点列表 [V, ..., V] 返回,如果不存在通过 V 的简单环,则返回 false。请注意,通过 V环路将作为列表 [V, V] 返回。

尝试查找从有向图 G 的顶点 V1 到顶点 V2 的尽可能短的简单路径。将路径作为顶点列表 [V1, ..., V2] 返回,如果不存在从 V1V2 的长度为 1 或以上的简单路径,则返回 false

返回有向图 G 的顶点 V入度

以某种未指定的顺序返回有向图 G入射V 上的所有边的列表。

以某种未指定的顺序返回有向图 GV 的所有入邻居的列表。

返回描述有向图 G{Tag, Value} 对的列表。将返回以下对

等效于 new([])

根据 Type 中的选项返回一个具有属性的空有向图

返回有向图 G 的边数。

返回有向图 G 的顶点数。

返回有向图 G 的顶点 V出度

以某种未指定的顺序返回有向图 G 中从 V 发出的所有边的列表。

以某种未指定的顺序返回有向图 GV 的所有出邻居的列表。

返回 {V, Label},其中 Label 是有向图 G 的顶点 V标签,如果不存在有向图 G 的顶点 V,则返回 false

返回有向图 G 的所有顶点的列表,顺序未指定。

类型

链接到此类型

add_edge_err_rsn()

查看源代码 (未导出)
-type add_edge_err_rsn() :: {bad_edge, Path :: [vertex()]} | {bad_vertex, V :: vertex()}.

当无法向图中添加边时的错误原因。

如果该边会在无环有向图中创建一个环,则返回 {error, {bad_edge, Path}}。如果 G 已经存在一个值 E 的边连接不同的顶点对,则返回 {error, {bad_edge, [V1, V2]}}。如果 V1V2 中的任何一个不是有向图 G 的顶点,则返回 {error, {bad_vertex,V}},其中 V = V1 或 V = V2

链接到此类型

d_cyclicity()

查看源代码 (未导出)
-type d_cyclicity() :: acyclic | cyclic.
链接到此类型

d_protection()

查看源代码 (未导出)
-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().

等效于 add_edge(G, V1, V2, [])

链接到此函数

add_edge(G, V1, V2, Label)

查看源代码
-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

链接到此函数

add_edge(G, E, V1, V2, Label)

查看源代码
-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

-spec add_vertex(G) -> vertex() when G :: graph().

使用空列表作为标签创建顶点,并返回创建的顶点。

创建的顶点由项 ['$v' | N] 表示,其中 N 是一个整数 >= 0。

-spec add_vertex(G, V) -> vertex() when G :: graph(), V :: vertex().

等效于 add_vertex(G, V, [])

链接到此函数

add_vertex(G, V, Label)

查看源代码
-spec add_vertex(G, V, Label) -> vertex() when G :: graph(), V :: vertex(), Label :: label().

使用 Label 作为顶点(新)标签,创建(或修改)有向图 G 的顶点 V。返回新顶点 V

-spec del_edge(G, E) -> true when G :: graph(), E :: edge().

从有向图 G 中删除边 E

-spec del_edges(G, Edges) -> true when G :: graph(), Edges :: [edge()].

从有向图 G 中删除列表 Edges 中的边。

-spec del_path(G, V1, V2) -> true when G :: graph(), V1 :: vertex(), V2 :: vertex().

从有向图 G 中删除边,直到从顶点 V1 到顶点 V2 没有路径为止。

所采用的过程的草图

  • G 中找到从 V1V2 的任意简单路径 v[1], v[2], ..., v[k]。
  • 移除 G 中所有从 v[i] 发出入射到 v[i+1] 的边,对于 1 <= i < k(包括多重边)。
  • 重复此操作,直到 V1V2 之间没有路径为止。
-spec del_vertex(G, V) -> true when G :: graph(), V :: vertex().

从有向图 G 中删除顶点 V。任何从 V 发出入射V 上的边也会被删除。

链接到此函数

del_vertices(G, Vertices)

查看源代码
-spec del_vertices(G, Vertices) -> true when G :: graph(), Vertices :: [vertex()].

从有向图 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

-spec edges(G) -> Edges when G :: graph(), Edges :: [edge()].

以某种未指定的顺序返回有向图 G 的所有边的列表。

-spec edges(G, V) -> Edges when G :: graph(), V :: vertex(), Edges :: [edge()].

以某种未指定的顺序返回有向图 G 中从 V 发出入射V 上的所有边的列表。

-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] 返回,如果不存在从 V1V2 的长度为 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 的简单环。

链接到此函数

get_short_path(G, V1, V2)

查看源代码
-spec get_short_path(G, V1, V2) -> Vertices | false
                        when G :: graph(), V1 :: vertex(), V2 :: vertex(), Vertices :: [vertex(), ...].

尝试查找从有向图 G 的顶点 V1 到顶点 V2 的尽可能短的简单路径。将路径作为顶点列表 [V1, ..., V2] 返回,如果不存在从 V1V2 的长度为 1 或以上的简单路径,则返回 false

有向图 G 以广度优先的方式遍历,并返回找到的第一条路径。

-spec in_degree(G, V) -> non_neg_integer() when G :: graph(), V :: vertex().

返回有向图 G 的顶点 V入度

-spec in_edges(G, V) -> Edges when G :: graph(), V :: vertex(), Edges :: [edge()].

以某种未指定的顺序返回有向图 G入射V 上的所有边的列表。

-spec in_neighbours(G, V) -> Vertex when G :: graph(), V :: vertex(), Vertex :: [vertex()].

以某种未指定的顺序返回有向图 GV 的所有入邻居的列表。

-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},其中 Cyclicitycyclicacyclic,取决于给 new 的选项。
  • {memory, NoWords},其中 NoWords 是分配给 ETS 表的字数。
  • {protection, Protection},其中 Protectionprotectedprivate,取决于给 new 的选项。
-spec new() -> graph().

等效于 new([])

-spec new(Type) -> graph() when Type :: [d_type()].

根据 Type 中的选项返回一个具有属性的空有向图

  • cyclic - 允许有向图中的(默认)。

  • acyclic - 有向图要保持无环

  • protected - 其他进程可以读取该有向图(默认)。

  • private - 该有向图只能由创建进程读取和修改。

如果指定了无法识别的类型选项 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出度

-spec out_edges(G, V) -> Edges when G :: graph(), V :: vertex(), Edges :: [edge()].

以某种未指定的顺序返回有向图 G 中从 V 发出的所有边的列表。

-spec out_neighbours(G, V) -> Vertices when G :: graph(), V :: vertex(), Vertices :: [vertex()].

以某种未指定的顺序返回有向图 GV 的所有出邻居的列表。

-spec vertex(G, V) -> {V, Label} | false when G :: graph(), V :: vertex(), Label :: label().

返回 {V, Label},其中 Label 是有向图 G 的顶点 V标签,如果不存在有向图 G 的顶点 V,则返回 false

-spec vertices(G) -> Vertices when G :: graph(), Vertices :: [vertex()].

返回有向图 G 的所有顶点的列表,顺序未指定。