当前课程知识点:数据结构(上) > 第六章 图 > (c)广度优先搜索 > 06C-4 可能情况
限于篇幅
这里不妨掐头去尾
只保留算法中的最主体部分
也就是这个while循环
我们讲过每次迭代都会首先取出
队首的顶点v
并且记下它的时间标签
这个顶点既然能够出队
那么在此前必然曾经入过队
请注意 我们这里所采用的原则就是
每当有一个顶点入队
都会标记为三部曲中的第二个状态
也就是DISCOVERED的状态
所以如果处于UNDISCOVERED的
状态的顶点 可以用白色来表示
那么我们这里不妨用黑色
来表示处于DISCOVERED状态的顶点
接下来 通过一个内嵌的for循环
逐一枚举出v的每一个邻居u
这里粗略地将u的状态分为两种情况
第一种情况 u还处于最初的
UNDISCOVERED的状态
用图来表示u现在的状态是这样
按照算法的策略 我们应该对它进行访问
这也就是为什么我们将它
标记为第二种状态DISCOVERED
并且随即令其入队
相应地 此后u的状态
也可以用这个图来表示
这种总体的效果意味着
我们从当前的顶点v成功地发现
并且访问了它的一个邻居u
因此从v通往u的那条边
将被算法采纳并保留下来
你应该记得初始化时
每一条边都会统一地被设置为
UNDETERMINED的状态
而按照算法的规则
一旦发现某一条边应该被采纳
我们就将它置为tree
也就是从UNDETERMINED
转入tree这种状态
顾名思义 所谓的树边tree edge
将会构成我们最终所需要构造的
那棵遍历支撑树
对于广度优先而言
也就是所谓的BFS Tree
好 我们每次所枚举的下一个邻居
未必总是处于
最初的UNDISCOVERED的状态
实际上 u还可能处于DISCOVERED状态
甚至在某些情况下处于VISITED的状态
尽管两种状态还是有本质的区别
但这里为了简化起见
不妨笼统地归入else这个分支
好在在稍后介绍的深度优先搜索
也就是DFS中
我们将对不同的情况做更为细致的分类
而那种分类的方法
同样是可以为DFS所借鉴的
在这种简化的版本中
我们此时都将由v通往u的那条边
归入CROSS类型
也就是跨边
至此既然我们已经完全了解了
邻居顶点的不同处理方法
整个算法也就介绍完毕
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验