怎么证明dfs 一定比bdfs深度优先算法深

其实说白了也就是全排列问题,将2代表的abc和3代表的def输出组合的字符。

我是按照普通方法递归来写的,觉得这道题目也只是考验编程考验递归的。没太多考虑当仩网看别人都提到DFS(深度优先算法)后,才意识到是有章法可循的。以前只以为深度优先和广度优先只是在图的遍历的时候才能用到想不到这些也只是工具,看你怎么去应用到你的算法里面

好了,不多说了基于上述原因,参考《数据结构》和《算法导论》将广度优先和深度优先总结一下

这两个算法的共同点,都是要有标记!数据结构采用的是一个数组来标记每一个结点是否被遍历;算法导论是在結点中附设一个颜色值来表示遍历的程度。其实质是一样的都需要借助于标记,来实现但在二叉树的遍历中就不需要了,因为不会形成回路

其实这是树的先根遍历的扩展。

只要遍历到某一个结点有子节点就先遍历子节点,当“子树”遍历完了以后再遍历另一个“子树”,只是由于存在回路所以遍历另一个子树的时候,会访问已经访问过的点 所以就需要标记来判断。

1:这个题目写的很简化茬visited[v]中v是一个确定的数值,表示数组下标但在VisitFunc(v)中,v为结点虽然程序写法简化,但更能突出我们要解决的问题

2:其实DFS和二叉树的先序遍曆很相像:

其实就是将二叉树的确定性,转化成图子节点的不确定性通过for循环来实现。

3:DFS可以应用在树的先序遍历当中

只要可能,就茬图中尽量深入总是对最近发现的结点v的出发边进行探索,直到该结点的所有出发边都被发现为止然后回溯到v的父节点(可能有多个,但之前遍历过程中从哪个点过来的,就是v的父节点)然后搜索该前驱结点的出发边。知道从源节点可以达到的所有的出发边都遍历唍如果在图中还有没被遍历的结点, 任选一个重复上述过程。直到所有的结点遍历完为止

2:当发现一个结点v时,记录其前驱结点u並设置父节点指针v.π = u; 同样设置三种颜色,白色表示尚未被遍历的结点灰色表示已经被遍历,但其子节点还没有被遍历完全黑色表示该結点以及所有的子节点都被遍历完全,要返回到父节点

3:给每个结点设置时间戳。v.d记录第一次被发现的时间v.f记录对v扫描完成时的时间戳。其中time为全局变量

u.color = GRAY; //当访问了该结点就将该节点设为灰色,接下来遍历其子节点其实不要该灰色指示也行


1、其生成的前驱制图G形成一個由多棵树所构成的森林,这是因为深度优先树的结构与DFS_VISIT的递归调用结构完全对应

2、结点的发现时间和完成时间具有括号化结构。也就昰只要两个结点的时间有重叠毕竟一个结点的时间段包含在另一个结点的时间段内。

类似于树的按层次遍历的过程

先访问根结点,然後访问与跟相连的所有结点v1-vn然后访问与v1-vn直接相连的所有结点(除去已经访问过的结点)。这就要用队列来时间:先访问某结点然后将該结点如队列。从队列出结点然后依次访问该结点的所有子节点(除去已经访问过的结点),并将这些刚刚访问结点入队列(这样将提湔访问过的结点就不用入队列了其子节点已经提前放入队列当中)。

该算法可以得到最短路径

因为我们有设置父节点指针,当通过广喥优先遍历之后我们从要找的叶节点反向遍历到根结点,就能得到最短的路径

}

N×M的由非负整数构成的数字矩阵你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻88个格子中的一个即认为这两个数字相鄰)求取出数字和最大是多少。

第1行有一个正整数T表示了有T组数据。

对于每一组数据第一行有两个正整数N和M,表示了数字矩阵为N行M列

接下来N行,每行M个非负整数描述了这个数字矩阵。

T行每行一个非负整数,输出所求得的答案

对于第1组数据,取数方式如下:

因為每一个数的选择都会影响到后面的数的选择这里我们用一个数组来保存当前状态的那个数。采用 dfs 来遍历时间复杂度为 O ( M × N ) O(M\times N) O(M×N)。直接贴玳码代码中有详细的注释。

}

22.3-1 画一个 3*3 的网格行和列的抬头分別标记为白色、灰色和黑色,对于每个表单元 (i, j)请指出对有向图进行深度优先搜索的过程中,是否可能存在一条边链接一个颜色为 i 的结點和一个颜色为 j 的结点。对于每种可能的边指明该种边的类型。另外请针对无向图的深度优先搜索再制作一张这样的网格。

22.3-2 给出深度優先搜索算法在图 22-6 上的运行过程假定深度优先搜索算法的第 5~7 行的 for 循环是以字母表顺序依次处理每个结点,假定每条邻接链表皆以字母表順序对立面的结点进行了排序请给出每个结点的发信啊时间和完成时间,并给出每条边的分类

22.3-3 给出图 22-4 的深度优先搜索的括号化结构。

22.3-4 證明:使用单个位来存放每个结点的颜色已经足够这一点可以通过证明如下事实来得到:如果将 DFS-VISIT 的第 8 行删除,DFS 给出的结果相同

中,在遞归过程中系统会调用栈存放未被检测的结点,并不一定需要将结点着黑色和灰色来区别因为程序中并没有检测结点是否黑色的命令。着黑白灰是为了易于观察

ANSWER:由于深度优先搜索满足括号化结构,将结点的关系以括号化结构表示易证明此关系

22.3-6 证明:在无向图中,根据深度优先搜索算法是先搜索 (u, v) 还是先搜索 (v, u) 来将边 (u, v) 分类为树边或者后向边与根据分类列表中的 4 种类型的次序进行分类是等价的。

ANSWER:有向圖是将无向图的一条边变成有方向的两条边所以本质上分类标准是等价的。

22.3-7 请重写 DFS 算法的伪代码以便使用栈来消除递归调用。

22.3-8 请给出洳下猜想的一个反例:如果有向图 G 包含一条从结点 u 到结点 v 的路径并且在对图 G 进行深度优先搜索时有 u.d < v.d,则结点 v 是结点 u 在深度优先森林中嘚一个后代

22.3-9 请给出如下猜想的一个反例:如果有向图 G 包含一条从结点 u 到结点 v 的路径,则任何对图 G 的深度优先搜索都将导致 v.d ≤ u.f

22.3-10 修改深度優先搜索的伪代码,让其打印出有向图 G 的每条边及其分类并指出,如果图 G 是无向图 要进行何种修改才能达到相同的效果。

ANSWER:在完成 DFS 之後对有向图 G 的边进行遍历按照 22.3-5的结论的规则。

无向图:只需要把三个 else 改成一个 else分类为后向边即可。

22.3-11 请解释有向图的一个结点 u 怎样才能荿为深度优先树中的唯一结点即使结点 u 同时有入边和出边。

22.3-12 证明:我们可以在无向图 F 上使用深度优先搜索来获得图 G 的连通分量并且深喥优先森林所包含的数的棵数与 G 的连通分量数量相同。更准确地说请给出如何修改深度优先搜索来让其每个结点赋予一个介于 1 和 k 之间的整数值 v.cc,这里 k 是 G 的连通分量数使得 u.cc = v.cc 当且仅当结点 u 和结点 v 处于同一个连通分量中。

ANSWER:当执行 DFS 的第 5、6 行时每跳入一次第 7 行,连通分量数加 1在 DFS-VISIT 里遇到的结点的联通分量数相同。

*22.3-13 对于有向图 G = (V, E) 来说如果 u ~ v 以为这图 G 至多包含一条从 u 到 v 的简单路径,则图 G 是单连通图请给出一个有效算法来判断一个有向图是否单连通图。

}

我要回帖

更多关于 dfs和bfs求最短路径的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信