给定连接的无向顶点标记图,图中的边和一些 n ≥2的数据,是否有一种有效的算法来查找所有连接的(但不一定是诱导的)子图订购包含该边缘的 n ?
我认为显而易见的事情是对边缘进行一种递归遍历,从给定边缘开始并注意没有一条路径多次使用边缘(尽管允许多次访问同一个顶点) 。遍历每条边后,我检查路径上有多少个顶点。如果它小于 n ,我继续进行遍历。如果它等于 n ,我会产生与路径对应的子图并继续遍历。如果它大于 n ,我会停止。但是,这种方法效率很低,因为它会一遍又一遍地生成许多相同的子图。
(如果重要的话,原始图中的所有顶点都是8度,我将寻找最多15个子图。)
答案 0 :(得分:1)
David Eisenstat对我的问题的评论建议改编his answer to a similar question。以下伪代码是我已经验证的适应,并且不会多次生成任何一个子图。其中n
指的是要返回的子图的顺序(如果要返回所有子图,则可以省略其测试),neighbours(e)
表示与{共享端点的边集合{1}}。首次调用该函数时,e
参数应包含给定的边,其余参数应相应设置。
GenerateConnectedSubgraphs(edgesToConsider, subgraphVertices, subgraphEdges, neighbouringEdges): let edgeCandidates ← edgesToConsider ∩ neighbouringEdges if edgeCandidates = ∅ if |subgraphVertices| = n yield (subgraphVertices, subgraphEdges) else choose some e ∈ edgeCandidates GenerateConnectedSubgraphs(edgesToConsider ∖ {e}, subgraphVertices, subgraphEdges, neighbouringEdges) GenerateConnectedSubgraphs(edgesToConsider ∖ {e}, subgraphVertices ∪ endpoints(e), subgraphEdges ∪ {e}, neighbouringEdges ∪ neighbours(e))