查找循环图中任意两个节点的公共子节点(后代)列表

时间:2014-08-22 14:02:54

标签: algorithm graph-theory cyclic-graph

我有一个循环有向图,我想知道是否有任何算法(最好是最优的算法)来列出任意两个节点之间的公共后代?与最低共同祖先(LCA)所做的事情几乎完全相反。

3 个答案:

答案 0 :(得分:1)

正如user1990169建议的那样,您可以使用DFS计算从每个起始顶点可到达的顶点集,然后返回交集。

如果您计划在同一个图表上重复执行此操作,那么首先计算和收缩strong components到表示一组顶点的超变量可能是值得的。作为副作用,您可以在超级转换上获得拓扑顺序。这允许数据并行算法同时计算来自多个起始顶点的可达性。将所有顶点标签初始化为{}。对于每个起始顶点v,将标签设置为{v}。现在,按拓扑顺序扫描所有顶点w,通过将w的标签x的联合设置为更新x的邻居w的标签{1}}的标签。使用位集来实现集合的紧凑,高效表示。缺点是我们无法修剪单个可达性计算。

答案 1 :(得分:0)

我建议使用DFS(depth first search)。

For each input node
    Create a collection to store reachable nodes
    Perform a DFS to find reachable nodes
        When a node is reached
            If it's already stored stop searching that path // Prevent cycles
            Else store it and continue

Find the intersection between all collections of nodes

注意:如果您愿意,可以使用相同的逻辑轻松使用BFS(breadth first search)。


实施此操作时请注意,您可以寻找一些特殊情况,以进一步优化您的搜索,例如:

  • 如果输入节点没有任何顶点,那么就没有公共节点
  • 如果一个输入节点(A)到达另一个输入节点(B),则A可以到达B可以的所有内容。
    这意味着算法不必在B上运行。

答案 2 :(得分:0)

为什么不反转边缘的方向并使用LCA?