我有这个问题,我无法证明。有人可以提供一些关于这个问题的见解
我们有一个连通图G =(V,E),并且作为特定顶点u∈V。假设我们计算一个以u为根的深度优先搜索树,并获得一个包含G的所有节点的树T.然后我们计算一个以u为根的广度优先搜索树,并获得相同的树T.证明G = T.(换句话说,如果T既是深度优先搜索树又是广度优先搜索树,其根植于你,那么G不能包含任何不属于T的边。)
答案 0 :(得分:5)
- 假设输入图 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的子代,所以在这两种情况下,遍历不会相同。