在无向图中找到大小为N的所有子树
||
给定一个无向图,我想生成所有子图,它们是大小为N的树,其中大小是指树中边的数量。
我知道它们很多(至少对于具有恒定连通性的图来说是指数级的)-但这很好,因为我相信节点和边的数量至少对于N的较小值来说很容易处理(例如10以下)。
该算法应该是内存有效的-也就是说,它不需要一次将所有图形或其中的一些大子集存储在内存中,因为即使是相对较小的图形,它也可能超出可用内存。因此,像DFS这样的东西是可取的。
给定起始图 0,这意味着此“分支”未能达到所需的深度,并且不能构成解决方案集的一部分(因此,整个内部循环与该元组关联的内容可以中止)。
那会行吗?有什么重大缺陷吗?任何更简单/已知/规范的方法可以做到这一点?
上面概述的算法的一个问题是它不能满足内存效率要求,因为递归将在内存中保存大量树。
graph
和所需长度N
,这就是我在想的伪代码。
选择任意一个节点,以ѭ2为起点,然后调用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,任意选择的新根的图形),并重复直到剩余图形的大小没有找到相关结果
已邀请:
11 个回复
傻寺俊擒
烷刨画颠离
葛瞎说漓
对于给定的边数,这将创建所有可能的顶点组合 缺少的是在给定边缘计数的情况下生成元组的工厂。 您最终获得了可能路径的列表,并且操作为Nodes ^(N + 1) 如果使用有序列表而不是元组,则无需担心创建对象的工厂。
倪蕊悲潍
(其中
是原始图的大小)以存储原始图,另外一个another9ѭ用于存储您想要的每个“小图”。 另一个工具(应该更好)是使用SAT解算器。也就是说,如果子图是一个图,则构造一个正确的SAT公式,并将其提供给SAT解算器。
版萍层分
期差骇蓟
凡夕
惭法搽
期差骇蓟
弦砂牧扁
在该算法的最后,T是大小为N的所有子树的集合。如果空间是一个问题,请不要保留树的完整列表,而要使用紧凑的表示形式,例如将T实现为决策树使用ID3。
慰泥悍瓶
图是完全连接的网格还是需要应用Kirchhoff的矩阵树定理