列举和索引N顶点的所有可能的树

Enumerating and indexing all possible trees of n vertices

本文关键字:有可能 顶点 索引      更新时间:2023-10-16

我们一直在试图找到一种用n个标记的顶点枚举和索引所有可能的树的方法。通过Cayley的定理,应有 n n − 2 n 标记为顶点的树木数。在C/C 中,是否可以将所有可能的树索引,以便用户输入整数/数字时,将实时生成唯一的树?

快速浏览有关Cayley公式的Wikipedia文章( n n − 2 公式您提到)将我指向prüfer序列,这是一个长度 n − 2的序列,该序列由(可能重复的)节点标签组成。很明显,有 n n − 2 这样的序列,每个序列可以表示为 n − 2位数 n 编号。不太明显的是,每个prüfer序列都对应于带有标记节点的唯一树,但是这个事实足以演示Cayley的公式。

关于Prüfer序列的Wikipedia文章解释了如何将序列变成相应的树。等同于将整数变成树。

我没有尝试过任何任何尝试,但看起来令人信服。

我对C或C 的表现不佳,但是我认为我可以提供这样的理论,以至于列举每棵树不应该太难了。如果我需要澄清任何内容,请发表评论。

思考二进制。

采用邻接矩阵。为了描述一个顶点是否连接到另一个顶点,我们使用1或0。因此,要使用邻接矩阵找到所有图表,我们将填充一个以1和1的连击填充矩阵。唯一的约束是树,a节点不能是自己的父母,也不能有多个父母。具有三个顶点的示例:

0 1 1  0 1 1  0 0 1
1 0 0  0 0 0  1 0 0
0 0 0  1 0 0  0 1 0 etc.

我们可以做的是将行并排放置,以使二进制序列描述每个矩阵。示例:

0 1 1 1 0 0 0 0 0  0 1 1 0 0 0 1 0 0  0 0 1 1 0 0 0 1 0 etc.

因此,给定九个位,我们可以用三个顶点描述所有图。这可以翻译成每个数字1-2^9的一棵树,减去彼此旋转的数字。

要将一个数字变成树,您只需将数字转换为二进制,然后将二进制变成矩阵。要修复自我连接,对于对角线上或超过对角线的每个" 1",将其进一步移动。然后:

1 0 0         1 0 1 
0 1 0    ->   0 0 0
0 0 1         0 1 0