列举和索引N顶点的所有可能的树
Enumerating and indexing all possible trees of n vertices
我们一直在试图找到一种用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
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 是否有可能使用debug_info获取ELF文件的源代码?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 有可能在C++中有类的查找表吗
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- 是否有可能编写新的叮当声现代化规则?
- 是否有可能通过指向另一个未关联的子对象的指针来获取指向一个子对象的指针?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 是否有可能具有放入容器的移动操作的类型?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 声明是否有可能逃脱其封闭的名称空间
- git-是否有互联网上某处所有可能错误的列表
- 有可能在DirectX 11中拥有SoA顶点缓冲区吗