bfs,即广度优先搜索,主要通过队列(queue)进行操作。
稍微解释一下,队列是一种基础数据结构,其形态类似于一支长长的队伍,大概如下:

在C++中,队列的头文件定义为:#include<queue>
队列的声明:queue<T1> q;
这样就定义了一个数据类型为"T1"的队列q。
成员函数及作用集合:

q.empty() 判断队列q是否为空,当队列q空时,返回true;否则为false(值为0(false)/1(true))。
q.size() 访问队列q中的元素个数。不可写成sizeof(q)或size(q)
q.push() 会将一个元素a置入队列q中
q.front() 返回队列q内的第一个元素(也就是第一个被置入的元素)。(不可写成front(q))
q.pop() 会从队列q中移除第一个元素。(不可写成pop(q))

队列是一种非常常见的数据结构,最常用于bfs(广度优先搜索)。

广度优先搜索可以将其想象成水滴落入水面溅起了的一圈一圈的涟漪,是由一个起始点开始一圈一圈进行扩散搜索的。(请一定要自行想象这个过程,非常重要!)
就比如这样一个丑陋的 图:

从顶点1开始搜索,广搜过程依次为:1-2-3-4-5-6-7-8.
从顶点1开始搜索,深搜过程依次为:1-2-3-5-7-8-4-6.
很明显,广搜是一次性把与当前顶点有连通关系的点全部搜索完了,才搜索更下一层
这样就可以很清楚的有深搜的思路并用代码实现了:

伪代码:

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

例题:单向公路
例题:密码锁
今天就讲到这里,后续会持续更新。

【bfs基础】①的更多相关文章

  1. ZOJ - 3890 Wumpus(BFS基础题)

    Wumpus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day Leon finds a very classic game call ...

  2. PTA 2-1 列出连通集【DFS+BFS基础】

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...

  3. Clone Graph leetcode java(DFS and BFS 基础)

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  4. POJ 2251 三维BFS(基础题)

    Dungeon Master Description You are trapped in a 3D dungeon and need to find the quickest way out! Th ...

  5. poj 3278 catch that cow BFS(基础水)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 61826   Accepted: 19329 ...

  6. 【万能的DFS和BFS基础框架】-多刷题才是硬道理!

  7. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  8. 2020牛客寒假算法基础集训营5 G.街机争霸 (bfs)

    https://ac.nowcoder.com/acm/problem/201961 预处理出僵尸走的路径,僵尸走的周期长度应该为2k-2,在普通的bfs基础上加上一维表示时间,从当前位置x,y和和时 ...

  9. poj 2046 Gap(bfs+hash)

    Description Let's play a card game called Gap. You have cards labeled with two-digit numbers. The fi ...

随机推荐

  1. 【JDK源码分析】String的存储区与不可变 专题

    <Think in Java>中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”. "=="判断的是两个对象的内存地址是否一样,适用于 ...

  2. iBatisNet 中 iterate标签的使用

    <iterate>标签,顾名思义是用来遍历标签用的. 支持的属性如下: 属性 说明 是否必选 open 遍历后生成的这些sql,开始的第一个符号 可选 close 遍历后生成的这些sql, ...

  3. 使用.NET进行高效率互联网敏捷开发的思考和探索【一、概述】

    不知从什么时候开始,创业变得很廉价,谈什么都是互联网,动辄融资千万.这阵风好像也刮向了程序员中,有那么一大批开发者,数据结构不好好学习.数据库原理不扎实掌握,在github上发布几个项目,用nodej ...

  4. Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)

    经历了多次延期后,在3月16号,Qt发布了5.6.0版本(全面支持高DPI无疑是一个亮点),从5.6.0版本开始,Qt直接移除了webkit模块,让webengine作为其替代选择,不过webengi ...

  5. HttpWebRequest 在出错时获取response内容

    HttpWebRequest 请求时,服务器会返回500  501这些错误 并包含错误信息,通过如下代码可以拿到错误信息 HttpWebResponse res; try { res = (HttpW ...

  6. CTO的职责,以及Goolge内部流程

    我先做一下自我介绍,我是 2007 年加入的 Google,在 Moutain View 总部任 Google SRE,今年年初回国加入 Coding. 在 Google 我参与了两个 Project ...

  7. QThread多线程编程经典案例分析(三种方法,解释了为什么使用moveToThread的根本原因,即为了避免调用QThread::exec() )

    传统的图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应. 一个解决方法是按照事件处理的思路: 调用 Void QApplication::pr ...

  8. NPOI 超简单的导出导入

      首先说说,第一次遇到过匿名导出的那个时候是在我在北京第一家公司,简单的声明一个对象就可以导出,那时候感觉高大上,自己也想研究研究,但是因为头将代码后来加密了根本看不到.好吧,研究了研究放弃了,后来 ...

  9. 生成sql server 数据库 脚本的 存储过程和调用

    USE [db_datadown] GO /****** Object: StoredProcedure [dbo].[GetTBScript] Script Date: 03/05/2015 09: ...

  10. php一个不错的分页

    1.分页源码 <?php class PageView{ /**页码**/ public $pageNo = 1; /**页大小**/ public $pageSize = 20; /**共多少 ...