Tree#
Recognition#
识别测试#
森林 是一个无环的无向图,而 树 是一个连通的森林。根据子领域的不同,有多种约定来将这些定义推广到有向图。
在一种约定中,森林和树的有向变体定义方式相同,只是忽略了边的方向。实际上,每条有向边都被视为一条无向边。然后,施加额外的限制来定义 分支 和 树状结构。
在另一种约定中,森林和树的有向变体分别对应于前一种约定的分支和树状结构。然后定义两个新术语,多森林 和 多树,以对应于另一种约定的森林和树。
总结如下:
每种约定都有其理由。第一种约定强调定义上的相似性,即有向森林和树只关注无环性,没有入度约束,就像它们的无向对应物一样。第二种约定强调功能上的相似性,即有向图的生成树是有向生成树状结构。也就是说,取任意生成树并选择一个节点作为根。然后为每条边分配一个方向,使得从根到每个其他节点都有一条有向路径。结果是一个生成树状结构。
NetworkX 遵循约定 “A”。明确地说,这些是:
- 无向森林
一个没有无向环的无向图。
- 无向树
一个连通的无向森林。
- 有向森林
一个没有无向环的有向图。等价地,基础图结构(忽略边的方向)是一个无向森林。在约定 B 中,这被称为多森林。
- 有向树
一个弱连通的有向森林。等价地,基础图结构(忽略边的方向)是一个无向树。在约定 B 中,这被称为多树。
- 分支
一个有向森林,每个节点最多有一个父节点。因此,最大入度等于 1。在约定 B 中,这被称为森林。
- 树状结构
一个有向树,每个节点最多有一个父节点。因此,最大入度等于 1。在约定 B 中,这被称为树。
对于树和树状结构,可以添加形容词 “生成” 来指定图在视为森林/分支时,由包含图中所有节点的单个树/树状结构组成。根据定义,每个树/树状结构在其定义的节点方面是生成的,因此引入 “生成” 的概念似乎是多余的。然而,节点可能代表较大图的一个子集,在这种上下文中,”生成” 成为一个有用的概念。
|
如果 |
|
返回 True 如果 |
返回 True 如果 |
|
|
如果 |
Branchings and Spanning Arborescences#
寻找最优分支和生成树形结构算法。
此实现基于:
J. Edmonds, 最优分支, J. Res. Natl. Bur. Standards 71B (1967), 233–240. URL: http://archive.org/details/jresv71Bn4p233
|
返回一个分支的总权重。 |
|
返回通过贪心算法得到的分支。 |
|
Returns a maximum branching from G. |
|
Returns a minimum branching from G. |
|
Returns a maximum spanning arborescence from G. |
|
Returns a minimum spanning arborescence from G. |
|
遍历图的所有生成树,按成本递增或递减顺序。 |
Encoding and decoding#
用于编码和解码树的函数。
由于树是一种高度受限的图形式,它可以以几种紧凑的方式表示。本模块包括用于以嵌套元组和Prüfer序列形式编码和解码树的函数。前者需要一个有根树,而后者可以应用于无根树。此外,Prüfer序列与标记树之间存在双射关系。
|
返回与给定嵌套元组对应的根树。 |
|
返回给定树的嵌套元组表示形式。 |
|
返回与给定普吕弗序列对应的树。 |
返回给定树的Prüfer序列。 |
Operations#
树的操作。
|
返回一个新的根树,通过连接 |
Spanning Trees#
计算最小/最大生成树/森林的算法。
|
返回无向图 |
|
返回无向图 |
|
使用 |
|
生成无向加权图中最小生成森林的边。 |
|
生成无向加权图中最大生成森林的边。 |
|
遍历图的所有生成树,按成本递增或递减顺序。 |
|
返回图 |
Decomposition#
用于计算图的连接树的函数。
返回给定图的连接树。 |
Exceptions#
用于编码和解码树的函数。
由于树是一种高度受限的图形式,它可以以几种紧凑的方式表示。本模块包括用于以嵌套元组和Prüfer序列形式编码和解码树的函数。前者需要一个有根树,而后者可以应用于无根树。此外,Prüfer序列与标记树之间存在双射关系。
当函数期望输入一个树(即无环的连通无向图)时,却接收到一个非树图作为输入时引发此异常。 |