图的广度优先遍历
广度优先遍历,就是在遍历时优先考虑遍历的广度,不像深度优先那样一条路径遍历到底,而是一层一层的遍历。
由于广度优先是一层一层节点的遍历,在图的边权值都为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);
}
}
}
}
标签:优先,遍历,队列,bfs,int,邻接,广度
From: https://www.cnblogs.com/CrescentWind/p/17920126.html