广度优先和深度优先是C++数据结构中图的两种常用的遍历方式,以下贴出我的理解以及大致代码的实现
广度优先(BFS)
原理
BFS会从根节点开始沿着图(树)的宽度遍历各个节点,即从根节点开始一层一层遍历。
具体步骤:
- 1.把所有节点设置为未标记
- 2.选择一个节点作为起点,并将入队,并标记为已访问(图中已访问为灰色)
- 3.判断队列是否为空,不为空执行 4
- 4.将起点出队,找到起点的邻接点且是没有访问过的节点,将其逐次尾插入队,并将这些节点标记为已访问
- 5.重复3
图示:
代码实现
#include <iostream>
#include <queue>
#define N 5
using namespace std;
//建图
int G[N][N] = {
{ 0, 1, 1, 0, 0 },
{ 0, 0, 1, 1, 0 },
{ 0, 1, 0, 1, 0 },
{ 1, 0, 0, 0, 0 },
{ 0, 0, 1, 1, 0 }
};
//标记节点是否访问
int visited[N] = { 0 };
//BFS算法
void BFS(int start)
{
queue<int> Q;//存放邻接点
Q.push(start);
visited[start] = 1;//已访问置为1
while (!Q.empty())//存在邻接点
{
int front = Q.front();
//cout << front << " "; //取出访问的节点
Q.pop();//在Q中推出已访问的节点
for (int i = 0; i < N; i++)
{
// 节点i未被访问过且节点i是节点front的邻接点
if (!visited[i] && G[front][i] == 1)
{
visited[i] = 1;//将 节点i 标记为已访问
Q.push(i);//Q中放入 节点i
}
}
}
}
int main()
{
//从 节点0 开始遍历
for (int i = 0; i < N; i++)
{
//已经遍历过,跳过此节点,遍历下一个节点
if (visited[i] == 1)
continue;
BFS(i); //遍历 节点i
}
return 0;
}