前言
上篇讲了DFS(深度优先算法),那么肯定也要讲BFS(广度优先算法),两者一般都是绑定一起来讲的。两者也有着不同的用处。
一、BFS是什么?
先用百度百科的来讲:
BFS(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和广度优先搜索类似的思想。属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
简单来说,BFS是一种图搜索的算法,目的是用于搜索检查每一个可以达到的点,直到找到结果为止。他和DFS的区别:DFS是一条路走到黑,如果没用路就返回,而BFS是从上往下层次依序遍历,我们一般用队列来实现BFS的遍历。
图解:(箭头的遍历方式)1 -> 2 -> 3 -> 4 -> 5 - > 6 -> 7 - > 8 - > 9 -> 10;
二、BFS的使用步骤
可以分为四个步骤:初始化(初始化队列和所求的值) -> 判空取队头(判断是否为空并取出队头) -> 拓展(利用队头去扩展) -> 判断入队(如果符合,将该点入队)。
void bfs(){ queue<int>q; q.push(初始位置); //初始化 while(q.size()){ int t = q.front(); q.pop();//取出队头的点,用该点向周围扩散。 if(check(j)){ //如果该点可行就将它加入队列中 q.psuh(j); //实施相应的操作 } } }
三、迷宫问题
迷宫问题:
#include<iostream> #include<cstring> #include<queue> using namespace std; typedef pair<int, int>PII; const int N = 110; int g[N][N], d[N][N]; int n, m; int bfs(){ //初始化 memset(d, -1, sizeof d); queue<PII>q; q.push({0, 0}); d[0][0] = 0; int dx[4] = {0, -1, 1, 0}, dy[4] = {1, 0, 0, -1}; while(q.size()){ //判空取头 PII t = q.front(); q.pop(); //拓展 for(int i = 0; i < 4; i ++){ int x = t.first + dx[i], y = t.second + dy[i]; if(x >= 0 && x < n && y >= 0 && y < m && d[x][y] == -1 && g[x][y] == 0){ //入队并实施相应操作。 q.push({x, y}); d[x][y] = d[t.first][t.second] + 1; } } } return d[n - 1][m - 1]; } int main(){ cin >> n >> m; for(int i = 0; i < n; i ++){ for(int j = 0; j < m; j ++){ cin >> g[i][j]; } } cout << bfs() << endl; return 0; }
总结:
这只是浅谈一下BFS,BFS算法还有很多方面,我会在后面慢慢更新博客讲解,阅读完这一篇文章,可以看看上篇的DFS的讲解:
DFS的链接: DFS (深度优先算法)_1234_6的博客-CSDN博客