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

Graph 什么';确定有向图中两个节点的所有公共祖先的有效方法是什么?,graph,directed-graph,Graph,Directed Graph,设G是一个有向图,其中可能包含圈,设m和n是该图中的两个节点。我感兴趣的是找到G中的所有节点a,这样就有路径从a->n1->n2…->n和a->m1->…->M对于我的应用程序,a节点集可以被视为n和m的共同祖先(循环和“我是我自己的爷爷”是无法忍受的) 我的第一个无智能方法是在n和m的前一条边上执行深度优先搜索,遍历图并收集集合(O(n))中所有访问的节点。然后,我执行这两个集合(O(n))的交集,得到预期的O(n)复杂度 在我实施之前,我想确保这是一种有效的方式。我的图可以有几十个甚至数千个

设G是一个有向图,其中可能包含圈,设m和n是该图中的两个节点。我感兴趣的是找到G中的所有节点a,这样就有路径从a->n1->n2…->n和a->m1->…->M对于我的应用程序,a节点集可以被视为n和m的共同祖先(循环和“我是我自己的爷爷”是无法忍受的)

我的第一个无智能方法是在n和m的前一条边上执行深度优先搜索,遍历图并收集集合(O(n))中所有访问的节点。然后,我执行这两个集合(O(n))的交集,得到预期的O(n)复杂度


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

对于那些屏息等待的人:我同意上面我自己的建议。高达10000个节点的性能似乎足够。

对于那些屏息等待的人:我同意上面我自己的建议。性能足以支持多达10000个节点。

只要在路径上找到一个共同的祖先,就可以“删减”其中一个搜索。因为一旦你这样做了,那么很明显,这个共同祖先节点的所有祖先都将是相同的。我认为你的想法是非常有效的,因为你必须在任何情况下检查
m
n
的祖先,它们的交集不再长。因为您正在标记已访问的节点,所以循环应该不是问题+1对于问题和内置答案,只要在一条路径上找到一个共同祖先,您就可以“删减”对其中一个搜索的搜索。因为一旦你这样做了,那么很明显,这个共同祖先节点的所有祖先都将是相同的。我认为你的想法是非常有效的,因为你必须在任何情况下检查
m
n
的祖先,它们的交集不再长。因为您正在标记已访问的节点,所以循环应该不是问题+1用于问题和内置答案