C++ 广度优先BFS 算法

2,211 阅读1分钟

广度优先和深度优先是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;
}