确定有向图中两个节点的所有共同祖先的有效方法是什么?

What's an efficient way to determine all common ancestors of two nodes in a directed graph?

G为有向图,可能包含环,设mn 是该图中的两个节点。我有兴趣在 G 中找到所有节点 a,这样就有从 a 引出的路径-> n1 -> n2 .. . -> n 还有 a -> m1 -> ... -> m。对于我的应用程序(循环和 "I'm my own grandpa" 不支持)。

我的第一个笨办法是对nm的前导边进行深度优先搜索,遍历图和在集合中收集所有访问过的节点 (O(n))。然后我执行这两个集合的交集 (O(n)),导致预期的 O(n) 复杂度。

在实施之前,我想确保这是一种有效的处理方式。我的图可以有数十甚至数千个节点,虽然它们很稀疏,但算法需要足够快才能进行交互(即 < 0.1 秒)。

对于那些已经屏住呼吸等待的人:我按照我上面的建议去做了。最多 10000 个节点时性能似乎足够。