树#
识别#
识别测试#
森林是一个无环无向图,而树是一个连通的森林。根据子领域的不同,将这些定义推广到有向图有多种约定俗成的方式。
在一种约定中,有向森林和树的变体以相同的方式定义,只是忽略边的方向。实际上,每条有向边都被视为一条无向边。然后,施加额外的限制来定义分支和树形图。
在另一种约定中,有向森林和树的变体分别对应于前一种约定的分支和树形图。然后定义了两个新术语:多森林和多树,以对应于另一种约定的森林和树。
总结
+-----------------------------+
| Convention A | Convention B |
+=============================+
| forest | polyforest |
| tree | polytree |
| branching | forest |
| arborescence | tree |
+-----------------------------+
每种约定都有其理由。第一种约定强调定义上的相似性,即有向森林和树只关注无环性,没有入度限制,就像它们的无向对应物一样。第二种约定强调功能上的相似性,其意义在于生成树的有向模拟是生成树形图。也就是说,取任意生成树并选择一个节点作为根。然后为每条边指定方向,使得从根到其他每个节点都存在有向路径。结果就是生成树形图。
NetworkX 遵循约定“A”。具体来说,它们是
- 无向森林
没有无向环的无向图。
- 无向树
连通的无向森林。
- 有向森林
没有无向环的有向图。等价地,底层图结构(忽略边的方向)是无向森林。在约定 B 中,这称为多森林(polyforest)。
- 有向树
弱连通的有向森林。等价地,底层图结构(忽略边的方向)是无向树。在约定 B 中,这称为多树(polytree)。
- 分支
每个节点至多有一个父节点的有向森林。因此最大入度等于 1。在约定 B 中,这称为森林(forest)。
- 树形图
每个节点至多有一个父节点的有向树。因此最大入度等于 1。在约定 B 中,这称为树(tree)。
对于树和树形图,可以添加形容词“生成”(spanning)来表示该图(当被视为森林/分支时)由一个包含图中所有节点的单个树/树形图组成。根据定义,每个树/树形图在其定义的节点上都是生成的,因此引入“生成”的概念似乎是多余的。然而,这些节点可能代表较大图中的一个节点子集,正是在这种背景下,“生成”一词成为一个有用的概念。
|
如果 |
|
如果 |
如果 |
|
|
如果 |
分支和生成树形图#
用于寻找最优分支和生成树形图的算法。
此实现基于
J. Edmonds, 最优分支, J. Res. Natl. Bur. Standards 71B (1967), 233–240. URL: http://archive.org/details/jresv71Bn4p233
|
返回分支的总权重。 |
|
通过贪心算法获得的分支。 |
|
返回 G 中的最大分支。 |
|
返回 G 中的最小分支。 |
|
返回 G 中的最大生成树形图。 |
|
返回 G 中的最小生成树形图。 |
|
以递增或递减的成本迭代图中的所有生成树形图。 |
编码与解码#
用于编码和解码树的函数。
由于树是图的一种高度受限形式,因此可以用多种方式简洁地表示它。此模块包含用于以嵌套元组和 Prüfer 序列形式对树进行编码和解码的函数。前者需要有根树,而后者可应用于无根树。此外,从 Prüfer 序列到带标签树之间存在双射。
|
返回与给定嵌套元组对应的有根树。 |
|
返回给定树的嵌套元组表示。 |
|
返回与给定 Prüfer 序列对应的树。 |
返回给定树的 Prüfer 序列。 |
操作#
对树进行的操作。
|
通过连接 |
生成树#
计算最小/最大生成树/森林的算法。
|
返回无向图 |
|
返回无向图 |
|
使用 |
|
生成无向加权图的最小生成森林中的边。 |
|
生成无向加权图的最大生成森林中的边。 |
|
以递增或递减的成本迭代图中的所有生成树。 |
|
返回 |
分解#
计算图的连接树的函数。
返回给定图的连接树。 |
异常#
用于编码和解码树的函数。
由于树是图的一种高度受限形式,因此可以用多种方式简洁地表示它。此模块包含用于以嵌套元组和 Prüfer 序列形式对树进行编码和解码的函数。前者需要有根树,而后者可应用于无根树。此外,从 Prüfer 序列到带标签树之间存在双射。
当函数期望输入为树(即没有环的连通无向图)但实际输入是非树图时引发此异常。 |