图和BFS和DFS树的等价性

时间:2016-04-27 05:11:20

标签: algorithm graph tree depth-first-search breadth-first-search

我有这个问题,我无法证明。有人可以提供一些关于这个问题的见解

我们有一个连通图G =(V,E),并且作为特定顶点u∈V。假设我们计算一个以u为根的深度优先搜索树,并获得一个包含G的所有节点的树T.然后我们计算一个以u为根的广度优先搜索树,并获得相同的树T.证明G = T.(换句话说,如果T既是深度优先搜索树又是广度优先搜索树,其根植于你,那么G不能包含任何不属于T的边。)

2 个答案:

答案 0 :(得分:5)

来自Berkeley CS Course Solution

  • 假设输入图 G 是无向的且已连接,但不是树。
  • 然后 G 必须包含一个循环 C 。假设 C 由k个节点 v1,v2,...,vk 组成,即 C 是周期 v1→v2→。 。 。 →vk→ v1
  • 现在,在 DFS 树中,节点 v1,v2,...,vk 将全部位于从根到叶的同一条路径上。
  • li>
  • 为什么?假设 vf 是这些节点中第一个要访问的节点。然后,必须在explore(vf)期间的某个时间点访问其余节点 因为另一个 vi 都紧密相连。
  • 但是,在 BFS 树中,节点 v1,v2,...,vk 将形成至少两个分支,从第一次访问的节点开始分支(想象 在周期上执行 BFS )。因此, BFS DFS 会产生 同一棵树 iff 输入图是一棵树。

@dtldarek在math.stackechange中的另一种方法:

  • 的确,如果图是简单的,连通的和无向的,并且非常基本的观察结果是,当且仅当在BFS / DFS搜索中遍历每个边时,G才是树。
  • 假设TBFS = T = TDFS,但是存在e∈E(G)∖E(T),即没有任何算法访问过的边缘。
  • 未遍历边缘的唯一原因可能是另一侧的顶点已被访问,但是如果存在DFS后边缘,则BFS必须在以前使用过它。 < / li>

答案 1 :(得分:4)

一旦你理解了BFS和DFS以及它们之间的基本区别,证明非常简单。

BFS VS DFS

dfs和bfs之间的主要区别在于它们是如何从root开始构建树的。当访问一个顶点时,会出现差异,如何访问相邻顶点。让我们解决每个以简单的方式逐遍遍历。

<强> 1.BFS

1.BFS首先访问根。然后访问距离根1个边缘距离的顶点。假设有4个顶点a,b,c,d与根相邻然后bfs将在访问root之后访问这4个顶点。

2.一旦bfs完成访问距离根1边缘的顶点。然后在root之后访问第一个顶点并重复相同的过程。第一个顶点是第一个顶点,这由队列数据结构处理。

当你使用它来遍历树时,这就是BFS被称为级别顺序遍历的原因。因为它逐级访问顶点,并且在树的情况下明确定义了级别。

<强> DFS

1.DFS首先访问root。访问root后,它不会访问与root相邻的所有顶点,但会进入图的深度。

2.一旦它访问root,它只访问与root相邻的顶点,然后从该顶点本身启动dfs,即它在访问与root相邻的所有顶点之前进入深度。它只有在它开始dfs的方向深度访问顶点时才会出现。

值得注意的是,BFS以TOP DOWN方式构建树,而DFS以BOTTOM UP方式构建树

如果两棵树相同,那么当你的图形本身就是树时就是这种情况。树只能是特殊的两种类型。

这对于像这样的倾斜树的图形来说也是如此:

root
|
|
V1
|
|
V2
|
|
.
.
.
Vn

在这种情况下,bfs和dfs都朝着一个方向。

或具有星形拓扑的图形如下:

               V1
               /
              /
   Vn-----root------V2
          |  \
          |   \
          V4  V3

Proof By声明

与上面两棵树不同的任何其他树将类似于在x级存在中间顶点v并且它具有多于1个子节点(比如2)c1和c2在x + 1级别,bfs将做的是访问v然后是c1和c2,但是dfs会做的是访问v然后是c1然后是c1的子代,所以在这两种情况下,遍历不会相同。