我有一个循环有向图,想知道是否有任何算法(最好是最优算法)可以制作任意两个节点之间的共同后代列表?这与最低公共祖先(LCA)所做的几乎相反。
我有一个循环有向图,想知道是否有任何算法(最好是最优算法)可以制作任意两个节点之间的共同后代列表?这与最低公共祖先(LCA)所做的几乎相反。
{}
。对于每个起始顶点v
,将标签设置为{v}
。现在,按照拓扑顺序扫描所有顶点w
,通过将其出边邻居x
的标签设置为x
的标签和w
的标签的并集来更新w
的标签。使用位集表示集合以实现紧凑高效的表示。缺点是我们不能像单个可达性计算那样进行修剪。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(广度优先搜索)来实现相同的逻辑。
当您实现此功能时,请记住还有一些特殊情况可以寻找以进一步优化您的搜索,例如:
为什么不直接反转边的方向并使用LCA呢?