【笔记】
深度优先搜索的先辈子图形成了一个由数棵深度优先树组成的深度优先森林。
时间戳
每个顶点v有两个时间戳:当顶点v第一次被发现时,记录下第一个时间戳d[v],当结束检查v的邻接表时,记录下第二个时间戳f[v]。
DFS的运行时间为Θ(V+E)。
深度优先搜索的性质
括号结构:把发现顶点u用左括号表示,完成用右括号表示,各级括号正确嵌套,是个完善的表达式。
括号定理
在对一个图G(V,E)的任何深度优先搜索中,对于图中任意两个顶点u和v,下述三个条件仅有一个成立:
区间[d[u],f[u]]和区间[d[v],f[v]]是完全不相交的,且在深度优先森林中,u或v都不是对方的后裔。
区间[d[u],f[u]]完全包含于区间[d[v],f[v]]中,且在深度优先树中,u是v的后裔。
区间[d[v],f[v]]完全包含于区间[d[u],f[u]]中,且在深度优先树中,v是u的后裔。
后裔区间的嵌套
在一个图G中的深度优先森林中,顶点v是顶点u的后裔,当且仅当d[u]<d[v]<f[v]<f[u]。
白色路径定理
在一个图G的深度优先森林中,顶点v是顶点u的后裔,当且仅当在搜索过程中与时刻d[u]发现u时,可以从顶点u出发,经过一条完全由白色顶点组成的路径到达v。
边的分类
对图G的边进行归类
一个有向图是无回路的,当且仅当对该图的深度优先搜索没有产生反向边。
根据在图G上进行深度优先搜索所产生的深度优先森林G_π,可以把图的边分为四种类型:
1) 树边,是深度优先森林G_π中的边。
2) 反向边,连接顶点u到它的某一祖先v的那些边。自环也被认为是反向的。
3) 正向边,连接顶点u到它某个后裔v的非树边(u,v)。
4) 交叉边,其他类型的边,一个顶点不是另一个顶点的祖先,也可以在不同树的顶点之间。
在对一个无向图G进行深度优先搜索的过程中,G的每一条边要么是树边,要么是反向边。
【练习】
22.3-1 画出一个3X3的图。
22.3-2 说明深度优先搜索在图上是如何进行的。
略
22.3-3 对图示深度优先搜索,给出其括号结构。
略
22.3-4 证明:边(u,v)是一条:
a) 树边或前向边,当且仅当d[u]<d[v]<f[v]<f[u]
b) 反向边,当且仅当d[v]<=d[u]<f[u]<=f[v]
c) 交叉边,当且仅当d[v]<f[v]<d[u]<f[u]。
22.3-5 证明:在一个无向图中,如果是根据在深度优先搜索中,(u,v)和(v,u)哪一个首先被遇到作为标准来将(u,v)归类为树边或反向边的话,就等价于根据边分类方案中的各类型的优先级来对它进行分类。
22.3-6 重写DFS,用栈消除递归。
22.3-7 给出一个反例。在一个有向图G中,如果有一条从u到v的路径,并且,在对G的深度优先搜索中,如果有d[u]<d[v],则在所得到的深度优先搜索森林中,v是u的一个后裔。
22.3-8 给出一个反例。如果有一条从u到v的路径,则任和深度优先搜索都必定能得到d[v]<=f[u]。
22.3-9 输出有向图G中每一条边及其类型。
22.3-10 解释有向图中,对于一个顶点u,是如何会最终落到 一棵仅包含u的深度优先搜索树中的。
顶点u与其他顶点不相连。
22.3-11 证明:对无向图G的深度优先搜索可以用来识别出G的连通分支,且深度优先森林中所包含的树的数量与G中的连通分支的数量一样多。
染色
*22.3-12 在一个有向图G中,如果u→v蕴含着对所有顶点u、v∈V,至多有一条从u到v的简单路径,则称G是单连通的。给出有效算法。