我有一个循环有向图,我想知道是否有任何算法(最好是最优的算法)来列出任意两个节点之间的公共后代?与最低共同祖先(LCA)所做的事情几乎完全相反。
答案 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)。
实施此操作时请注意,您可以寻找一些特殊情况,以进一步优化您的搜索,例如:
答案 2 :(得分:0)
为什么不反转边缘的方向并使用LCA?