算法笔记——深度/广度优先搜索
点击阅读更多查看文章内容
算法笔记——深度/广度优先搜索
深度优先搜索和广度优先搜索主要是用在图的遍历中,模板性很强,我个人认为是比较简单的算法,下面主要写一下深搜和广搜的模板,照着模板多做题基本就能掌握了
深度优先搜索
过程:
- 访问指定的起始顶点
- 若当前访问的顶点的邻接顶点有未被访问的,则选择其中一个顶点访问,然后回到第一步
- 若当前的顶点的邻接顶点都已经访问,则返回当前顶点的上一个顶点
如下图,其实就是先沿一条边访问到底,然后再返回访问另一条边
模板
DFS一般通过递归来实现
1 | void dfs(int x){ |
这里在枚举下一个邻接顶点的时候,如果是在图中,我习惯先定义一个方向向量,然后以此来枚举下一个顶点
以上下左右四个方向为例:
首先定义:
1 | int fx[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; |
枚举:
1 | for (int i = 0; i < 4; i++) |
广度优先搜索
过程:
- 访问指定的起始顶点
- 将顶点的所有邻接顶点加入队列
- 返回第一步访问队列的队首元素,队首元素弹出
如下图,先将当前顶点的邻接顶点都加入队列,然后再访问下一层的邻接顶点
模板
BFS一般通过队列来实现
1 | queue<int> qu;//定义队列 |
以上模板仅仅是最基础的样例,不同的题目肯定还会有所不同,大家还要在模板的基础上结合题意进行进一步的修改
例题
算法笔记——深度/广度优先搜索