当前课程知识点:数据结构(上) > 第六章 图 > (d)深度优先搜索 > 06D-7 嵌套引理
通过dfs搜索
为所有顶点所标注的两个时间标签
实际上蕴含了大量有用的信息
这一点可以由所谓的括号引理
或嵌套引理来加以印证
为此 我们首先要引入
所谓活动期的概念
也就是由它的dTime和fTime
两个时间标签
所界定的那样一段时间范围
也就是这个顶点在整个dfs搜索过程中
处于活跃状态的时间范围
那么所谓的嵌套引理
告诉我们任何有向图
经过了dfs搜索之后
在对应的dfs森林或者dfs树中
任何一对顶点之间
存在直系的血缘关系
当且仅当它们的活跃期存在
包含与被包含的关系
具体来说
祖先的活跃期必然包含
后代的活跃期
而反过来 如果两个顶点之间
没有任何直系血缘关系
那么它们的活跃期
也是彼此互不相交的
为了获得对这个引理
更为直观的认识
我们不妨以横向作为时间轴
依然以刚才的那个有向图为例
我们可以将每个顶点
都沿水平方向适当展开
使得它们恰好覆盖
各自所对应的活跃期
于是就不难看出 作为祖先
它的活跃期的确会覆盖它的后代
而后代
也将继续覆盖它的后代
以致后代的后代
而反过来 没有直接血缘关系的节点
比如说F和B
或者B和G
以致D和F
或者B和E
它们的活跃期都的确彼此不搭
没有任何公共的部分
这样一种特性是非常强大的一个工具
比如在算法中 我们经常需要
做的一个判断就是
任意的一对顶点 v 和 u 之间
在遍历树中是否存在
一个直系血缘的关系
如果没有这样一种简便的机制
我们将不得不从 u 出发
顺着parent引用
不断地溯流而上
直到有一天遇到顶点v
才能够确定它们的确存在
祖先和后代的直系关系
或者不得不一直追溯到
整个遍历的起点
从而断定u和v之间并没有直系血缘关系
而现在呢 借助时间标签
我们可以快速准确地
在O(1)的时间内
就得出相应的结论
这种机制所带来的更多便利之处
还需要同学们
在实现相关算法过程中
不断地深入体会
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验