当前课程知识点:数据结构(上) > 第六章 图 > (c)广度优先搜索 > 06C-3 实现
以下我们就来介绍图广度优先遍历算法的
一种描述和实现方式
具体是这样
可以看到 遍历的起点
总是某个预先指定的顶点v
既然图的广度优先遍历
可以视作为树的层次遍历的一种推广
所以与后者相仿
这里依然借助一个队列结构
也就不足为奇了
预处理的手法也是相仿的
首先需要令当前的这个顶点v入队
如果说有所不同的话
那么这里需要在v入队之前
将它的状态由最初的undiscovered
转化为discovered 也就是刚被发现
接下来是一个while循环
每次都通过dequeue()取出队首的顶点
并且重新命名为v
请注意 在每一个顶点刚刚出队
并随即接受访问的同时
我们还需要给它打上一个时间标签dTime
你会注意到 在算法的入口处
还有一个名为clock的引用型参数
是的
顾名思义 它就像是一块钟表
在整个算法的运行过程中
它都会忠实地给出时间的进度
任何时候如果你希望加注当前的时间标签
你只需要将这块表取出来
并且读取上面的时刻
当然bfs只是图算法的一个基本框架
在不同的具体问题中
你可能在这个时刻需要对当前的顶点
做相应的处理
我们可以笼统地认为
这些操作就是我们所谓的
对这个顶点的真正访问
那么接下来 按照算法的策略
我们需要枚举出当前节点v的所有邻居
这可以通过这条for循环语句来实现
这里的firstNbr以及nextNbr接口
你应该并不陌生
是的
我们此前曾经介绍过它们的原理以及实现
我们可以看到
通过这两个接口的这样一个组合
我们可以简捷地从v的第一个邻居开始
不断地转向它的下一个邻居
直至所有邻居都被枚举完毕
而每枚举出一个新的邻居u
我们都会根据u当前的状态
采取不同的处理方法
具体的处理方式留待下一页再作介绍
那么一旦v的所有邻居都被遍历
并且处理完毕
v自己也将从刚才的discovered状态
顺利地转化为visited状态
由此可见
经过整个的遍历搜索过程
每一个顶点的状态都会由最初的undiscovered
转化为discovered
并最终转化为visited
这样的三个状态也就构成了每一个顶点
在它的生命期内的三部曲
那么总有一天 这个队列会变空
整个广度优先搜索的过程
也就顺利结束
那么接下来唯一仍未交待的就是
对于枚举出来的每一个新邻居u
都有哪些处理方式呢?
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验