图(树)的广度优先遍历bfs

发布时间 2023-12-21 21:10:09作者: 凪风sama

图的广度优先遍历

广度优先遍历,就是在遍历时优先考虑遍历的广度,不像深度优先那样一条路径遍历到底,而是一层一层的遍历。
广度优先遍历
由于广度优先是一层一层节点的遍历,在图的边权值都为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);
			}
		}
	}
}