当前课程知识点:数据结构(上) > 第六章 图 > (d)深度优先搜索 > 06D-4 无向图
我们首先来看一个无向图的实例
在此我们首先要准备一张表
其中的每一行
分别对应于图中的某一顶点
可以看到 每一行都有三列
分别是这个顶点的标识
也就是对应的字母
以及它的dTime
和fTime两个时间标签
我们假设在时钟指向第一秒的时候
a节点被发现并且接受访问
于是我们将它在图中加粗
并且将这个字母转为大写字母
以表示它是当前节点
可以看到
它的dTime时间标签已经更新
那么在接下来的for循环中
我们将立足于顶点A 环顾四周
试图找到第一个尚未发现的邻居
不妨假设就是b
于是在接下来的第二秒
节点b将会被发现
同样 我们对它做加粗
并且大写的处理
自然 从刚才的顶点a
通往现在的顶点B之间的那条边
也将会被采纳并且保留下来
最终作为遍历树的有机组成部分
好 此后在第三秒发现C
在第四秒会发现F
以及在第五秒会发现H
再以下 在第六秒发现G
在这一过程中所经过的所有的边
都将作为树边被保留下来
再以下 在第七秒 顶点J将会被发现
此时出现了算法的一个转折
我们发现J没有任何有效的邻居
更不用说尚未访问的邻居了
因此将会从顶点j沿着此前的树边
回退到顶点G
这样的一个过程也就是
所谓的回溯 back-track
不要忘了 在j被访问完毕的时刻
我们也需要将对应的时间标签记录下来
也就是第八秒
再以下 我们将在第九秒
发现并且访问顶点I
并且在第十秒发现并访问顶点D
接下来立足于顶点D 我们会发现
它有一条边通往顶点g
请注意 此时的顶点g
是处于DISCOVERED状态
也就是说 在我们的分支中
这是属于第二种情况
因此从顶点D通往顶点g的这条边
将会被标记为"回边" BACKWARD
同理 从顶点D通往顶点a的那条边
也将被标记为BACKWARD
在标记完由顶点d发出的所有边之后
我们依然需要顺着此前的树边回退
抵达顶点I
不要忘了 在回退的同时
我们还应该更新顶点d的fTime时间标签
同理接下来 在顶点i处
依然需要做一次回退
对应的时刻是第12秒
当我们重新回到顶点G的时候
会发现还有一条边尚未标记
既然是从当前的顶点G通往一个
当前处于DISCOVERED状态的顶点
那么这条边也应该属于BACKWARD类型
好 在接下来的第13秒
g也将回溯到它的父亲 也就是H顶点
H顶点继续在第14秒回溯到它的父亲
也就是顶点F
而顶点f也会在
接下来的第15秒
回溯到它的父亲 也就是C
而c呢 也会在接下来的第16秒
回溯到它的父亲B
此时立足于当前的顶点B
我们会发现还有一个
处于初始状态的顶点e
因此顶点E
将在接下来的第17秒
被发现并且访问
再接下来
立足当前的顶点E
我们会发现 它可以通往
目前处于DISCOVERED的状态的顶点a
所以相应的这条连边
也依然是一条回向边
当所有的出边都已标记
并且处理之后
我们需要在第18秒
从顶点e 回退到顶点B
并且继而在第19秒
从顶点b回退到顶点A
最终在第20秒
顶点a也完成了对自己的访问
因为我们已经回到了最初的起点
所以整个遍历过程
也就因此宣告结束
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验