C++ 广度优先搜索(bfs)(五十四)【第一篇】

今天我们来学习一下一个新的搜索,广度优先搜索。

1.广度优先搜索的前提

队列(queue) 是一种 操作受限制 的线性表,其限制:

  • 只允许从表的前端(front)进行删除操作;

  • 只允许在表的后端(rear)进行插入操作。

一般允许进行插入的一端我们称为 队尾 ,允许删除的一端称为 队首 ;

C++ 广度优先搜索(bfs)(五十四)【第一篇】_第1张图片

队列的主要操作包括:

  • 入队(push):队列的插入操作

  • 出队(pop):队列的删除操作

  • 判断队列是否为空(empty)

  • 统计队列元素的个数(size)

  • 访问队首元素(front)

数据存取特点:具有 先进先出 的性质。

2.广度优先搜索

广度优先搜索,又称宽度优先搜索,简称 BFS,我们以后都会用 BFS 来表示广度优先搜索。与深度优先搜索不同的是,广度优先搜索会先将与起始点距离较近的点搜索完毕,再继续搜索较远的点,而深搜却是沿着一个分支搜到最后。

BFS 从起点开始,优先搜索离起点最近的点,然后由这个最近的点扩展其他稍近的点,这样一层一层的扩展,就像水波扩散一样。

C++ 广度优先搜索(bfs)(五十四)【第一篇】_第2张图片

对上图进行深搜按照顶点访问顺序会得到序列:A−B−E−F−C−D−G

对上图进行广搜按照顶点访问顺序会得到序列:A−B−C−D−E−F−G

广度优先搜索的层次关系是很明显的,上面的图的分层次关系如下:

  • 第一层的点为 A

  • 第二层的点为 B,C,D

  • 第三层的点为 E,F,G

BFS 需要借助队列来实现:

  1. 初始的时候把起始点放到队列中,并标记起点访问。

  2. 如果队列不为空,从队列中取出一个元素 
    x,否则算法结束。

  3. 访问和 
    x 相连的所有点 
    v,如果 
    v 没有被访问,把 v 入队,并标记已经访问。

  4. 重复执行步骤 2。

最后写出来的代码框架如下:

void bfs(起始点) {
    /*将起始点放入队列中;*/
    /*标记起点访问;*/
    while (/*如果队列不为空*/) {
        /* 访问队列中队首元素x */
        /* 删除队首元素 */
        for (/* x 所有相邻点 */) {
            if (/* 该点未被访问过且合法 */) {
                /*标记该点访问*/
                /*将该点加入队列末尾*/
            }
        }
    }
    /*队列为空,广搜结束*/
}

注意这里标记一个点是否访问必须在放入队列的时候标记,避免一个点在队列中但没被访问的情况下再次被放入队列的可能。

你可能感兴趣的:(C++,c++,宽度优先,开发语言)