图(树)的广度优先遍历bfs
图的广度优先遍历
广度优先遍历,就是在遍历时优先考虑遍历的广度,不像深度优先那样一条路径遍历到底,而是一层一层的遍历。
由于广度优先是一层一层节点的遍历,在图的边权值都为1的情况下,若我们要求出节点a到节点b的最短路,就可以以a为源点(source)进行广搜,当a第一次搜到b时,其路径一定最短。因为在广搜时每一层的节点距离a的距离都是相同的,层数越多距离a越远,因此第一次搜到b时,b所在的层数最小,于是距离a的距离也就最小
不论是图的广搜还是树的广搜,我们都可以看到他们都是从源点开始,逐层搜索源点的邻接点及其邻接点的邻接点。因此我们需要一个数据结构来存储一个点的所有邻接点,于是我们选择队列来实现深度优先搜索。
方便起见可以使用queue库来建立一个队列,但当想存储整个队列的状态时可以选择自己建立一个队列
这里图的存储采用邻接表法使用vector来存
#include <iostream> #include <vector> #include <queue> using namespace std; const int N = 10; vector<int> h[N]; queue<int> q; int s; bool check[N]; void bfs() { q.push(s);//将源点压入队列 while (!q.empty())//队列不空就继续遍历 { int k = q.front(); q.pop();//从队列中取出一个节点 for (int i = 0; i < h[k].size(); i++) { int temp = h[k][i]; if (!check[temp])//将其未遍历到的邻接点存储进去 { check[temp] = true; q.push(temp); } } } }
本文作者:凪风的博客
本文链接:https://www.cnblogs.com/CrescentWind/p/17920126.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步