【发布时间】:2015-07-06 10:38:24
【问题描述】:
令G为有向图,可能包含环,令m和n为该图中的两个节点。我有兴趣在 G 中找到所有节点 a 以便有路径从 a -> n 1 -> n2 ... -> n 还有a -> m1 -> ... -> m。 a 节点集可以被认为是我的应用程序的 n 和 m 的共同祖先(循环和“我是我自己的爷爷”无条件)。
我的第一个愚蠢的方法是对 n 和 m 的前驱边执行深度优先搜索,遍历图并收集所有访问过的节点集合(O(n))。然后我执行这两个集合的交集 (O(n)),得到预期的 O(n) 复杂度。
在实现此功能之前,我想确保这是一种有效的处理方式。我的图可以有数十甚至数千个节点,虽然它们很稀疏,但算法需要足够快才能进行交互(即
【问题讨论】:
-
只要在路径上找到 1 个共同祖先,您就可以“修剪”您对其中一个搜索的搜索。因为一旦你这样做了,那么显然那个共同祖先节点的所有祖先都将是相同的。
-
我认为您的想法尽可能高效,因为无论如何您都必须检查
m和n的祖先,并且它们的交集不再。由于您正在标记已访问的节点,因此周期应该不是问题。为问题 +1 并内置答案
标签: graph directed-graph