有效地找到给定订单的连接子图(不一定是诱导的)

时间:2013-06-05 11:07:19

标签: algorithm time-complexity graph-algorithm

给定连接的无向顶点标记图,图中的边和一些 n ≥2的数据,是否有一种有效的算法来查找所有连接的(但不一定是诱导的)子图订购包含该边缘的 n

我认为显而易见的事情是对边缘进行一种递归遍历,从给定边缘开始并注意没有一条路径多次使用边缘(尽管允许多次访问同一个顶点) 。遍历每条边后,我检查路径上有多少个顶点。如果它小于 n ,我继续进行遍历。如果它等于 n ,我会产生与路径对应的子图并继续遍历。如果它大于 n ,我会停止。但是,这种方法效率很低,因为它会一遍又一遍地生成许多相同的子图。

(如果重要的话,原始图中的所有顶点都是8度,我将寻找最多15个子图。)

1 个答案:

答案 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))