各种方式及其运行时检查两个节点或顶点之间是否存在路径?

时间:2013-11-18 21:56:57

标签: algorithm graph depth-first-search breadth-first-search disjoint-sets

我在SO和其他地方看过文章,其中引用了以下方法来确定图表中两个节点之间是否存在路径。我想知道是否有人比另一个好?

  1. 广度优先搜索 - O(V + E)

  2. 深度优先搜索 - O(V + E)

  3. 使用disjoint sets - O(n log n)(不确定是O(n log n)

  4. 所有这些方法是否适用于有向和无向图,循环和非循环?

    对一个人有偏好吗?

2 个答案:

答案 0 :(得分:3)

嗯,我绝对可以回答线性时间算法 - BFS,DFS应该适用于所有类型的图形(有向/无向,循环/非循环)。
想一想:从给定节点开始,他们将访问每个边缘,每个节点最大一次,这样他们就不会受到周期的影响。
他们会做它以不同的方式,BFS - “逐级”,DFS - 以一种贪婪的迷宫逃避的方式,但它们都将在某个点(路径存在)或之后终止遍历所有边缘并访问每个节点,它们将以否定结果终止 “指向性”仅影响来自给定节点A的节点可到达,但算法(bfs和dfs)的实现对图形是否指示无知。

我不确定 union-find 结构(带有不相交集的最后一项)会在有向图的情况下为您提供帮助。
Afaik,Union-find会将( merge )节点ab放在一个集合中,如果它们可以互相访问,即两个{{1}都有一个路径转到a,反之亦然 如果您在ba -> b之间有边a,并且没有其他路径从bb,那么根据 Union-查找数据结构将无法将它们放在一个集合中。
, 但显然路径a - > a存在。

答案 1 :(得分:1)

BFS优于DFS,因为它找到最短路径[因此您可以更快地停止算法]。

不太了解不相交的集合(很快会读到它)并且可能更新我的答案。 [从我看来它似乎比BFS更复杂,因为它用于查找图表的所有组件]。

您未提及的选项之一是考虑双向BFS - 因此同时从开始和结束运行BFS并在两次搜索都满足时停止。但是,如果很可能没有路径存在,并且 - 在循环图的情况下 - 只有在保持对传入和传出边缘的引用时才能实现它。

当然可以:BFS和DFS可以处于无向,有向,循环和非循环状态。

如果你想要,你可以稍微玩here