在无向图中找到所有大小为N的子树

18
给定一个无向图,我想生成所有大小为N的树的子图,其中“大小”是指树中边的数量。
我知道它们很多(对于具有常数连通性的图至少呈指数增长),但这没关系,因为我相信节点和边数使得至少对于小的N值(比如10或更少)它是可处理的。
该算法应该是内存高效的——也就是说,它不应该需要一次性拥有所有图形或某个大的子集,因为即使对于相对较小的图形,这可能会超出可用内存。因此像DFS这样的算法是理想的。
在伪代码中,假设给定起始图graph和所需长度N: 从任意一个节点root作为起点并调用alltrees(graph, N, root)。
alltrees(graph, N, root)
 given that node root has degree M, find all M-tuples with integer, non-negative values whose values sum to N (for example, for 3 children and N=2, you have (0,0,2), (0,2,0), (2,0,0), (0,1,1), (1,0,1), (1,1,0), I think)
 for each tuple (X1, X2, ... XM) above
   create a subgraph "current" initially empty
   for each integer Xi in X1...XM (the current tuple)
    if Xi is nonzero
     add edge i incident on root to the current tree
     add alltrees(graph with root removed, N-1, node adjacent to root along edge i)
   add the current tree to the set of all trees
 return the set of all trees

这仅找到包含所选初始根的树,因此现在删除此节点并调用alltrees(已删除根的图形,N,新选择的任意根),并重复直到剩余图形的大小 < N (因为将不存在所需大小的树)。

我还忘记了每个访问的节点(每个alltrees调用的根)需要被标记,并且上面考虑的子项集应仅为相邻未标记的子项。 我猜我们需要考虑这样一种情况,即没有未标记的子项存在,但深度> 0,这意味着该“分支”未能达到所需深度,并且不能成为解决方案集的一部分(因此与该元组关联的整个内部循环可以中止)。

这会起作用吗? 有什么主要缺陷吗? 有没有更简单/已知/规范的方法来做到这一点?

上述算法的一个问题是它不满足内存有效的要求,因为递归将在内存中保持大量的树集合。


你说你不想把所有的图形都保存在内存中。但是,那么所有大小为N的图形呢? - Fantius
1
只是为了确保大家理解术语,以下陈述是否正确?2个相连的顶点形成一个大小为1的图。3个相连的顶点形成一个大小为3的图,有3个大小为1的子图,以及3个大小为2的子图。对吗? - Fantius
我也不想在内存中保存所有大小为N的图形。由于分支因子(平均节点度)很高,大小为N的图形数量比所有小于N的大小的图形数量要大得多,因此这些语句基本上是等价的。 - BeeOnRope
是的,你对子树数量的描述是正确的。后一种情况也有0个大小为3的子图,因为不允许出现循环。 - BeeOnRope
你应该在问题中提到这个图是无环的,最好放在标题里。这会使得答案更容易,因为在一个无环图中,一旦确定了根节点,它就可以被处理成一个有向树。 - JCooper
显示剩余6条评论
11个回答

-2

我认为问题没有明确定义。你提到图是无向的,你要找的子图的大小为N。缺少的是边数以及你寻找的树是否为二叉树或者允许有多棵树。此外,你是否对同一棵树的镜像反射感兴趣,换句话说,兄弟姐妹的排列顺序是否重要?

如果你要查找的树中单个节点允许有超过2个兄弟姐妹,那么应该允许,因为你没有在初始图上指定任何限制,并且你提到结果子图应包含所有节点。 你可以通过执行深度优先遍历来枚举所有具有树形结构的子图。在遍历期间,你需要为每个兄弟姐妹重复遍历图。当你需要将每个节点作为根节点重复操作时。 丢弃对称树,你最终会得到

 N^(N-2) 

如果你的图是完全连通的网格或者你需要应用基尔霍夫矩阵树定理


嗨,Alexei,我不确定你所说的“缺少的是边数”是什么意思。二叉树没有限制。我寻找的树是图论意义上的典型树 - 在图中,顶点通常没有任何顺序,形成图的树也是如此。我不完全确定你所说的“镜像反射”是什么意思,但基本上每棵树都由它包含的(无序)边集完全定义,并且不应有重复。 - BeeOnRope
关于您提出的解决方案,您如何建议有效地“放弃对称树”?这些将主导枚举过程,并导致时间上不可行(生成和放弃树)和空间上的难以承受(记住所有树以便放弃),因此即使实际树的数量是可处理的,这个生成策略也不会是一个好的选择。 - BeeOnRope
如果你有一个根节点为A,叶子节点为B和C的三节点树(A (B, C)),那么据我所知,它的镜像将是(A (C, B))。 - Alexei Polkhanov
我在这里使用“树”一词的意思是指图论中的树——没有根节点,也没有任何节点的顺序。基本上,“树”在这里表示一个连通的无环图。 - BeeOnRope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接