不要哀求,学会争取,若是如此,终有所获.|

凪风sama

园龄:1年11个月粉丝:18关注:6

图(树)的广度优先遍历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 中国大陆许可协议进行许可。

posted @   凪风sama  阅读(21)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示