概念
- “发现” : 指节点第一次被访问
- “时间戳” :对于每个节点u,有两个时间戳u.d , u.f ,分别表示发现节点u和完成对u的邻接链表扫描的时间(即节点u被涂上黑色的时候)。 注意:在 u.d 时刻,节点u被涂上灰色 ;在 u.f 时刻,节点u被涂上黑色。那么在 [u.d , u.f ) 这段时间内,节点u是灰色的。
- “真后代” :在深度优先搜索森林中,节点u的子孙称为其真后代 。
- 边的分类 :树边(深度优先森林G.π中的边),后向边(指向祖先节点的边),前向边(指向后代节点的边),横向边(其他所有边,包括同一深度优先树中连接互不为祖先两点的边及连接不同深度优先树的边)。
伪代码(摘自《算法导论》22.3)
DFS(G)
for each vertex u ∈ G.V
u.color = WHITE
u.π = NIL
time=0
for each vertex u ∈ G.V
if u.color == WHITE
DFS-VISIT(G,u)
DFS-VISIT(G,u)
time = time + 1
u.d = time
u.color = GRAY
for each v ∈ G:Adj[u]
if v.color == WHITE
v.π=u
DFS-VISIT(G,v)
u.color = BLACK
time = time+1
u.f = time
运行时间:θ(V+E)
性质
22.6 时间戳关系
u.d<u.f
定理 22.7 括号化定理
在对有向图或无向图 G=(V,E)
进行的任意深度优先搜索中,对于任意两个节点 u 和 v 来说,下面三种情况只有 一种 成立:
- 区间
[u.d,u.f]
和区间[v.d,v.f]
完全分离,在深度优先搜索森林中,节点u不是节点v的后代,节点v也不是节点u的后代 - 区间
[u.d,u.f]
完全包含在区间[v.d,v.f]
内,在深度优先树中,节点u是节点v的后代 - 区间
[v.d,v.f]
完全包含在区间[u.d,u.f]
内,在深度优先树中,节点v是节点u的后代
推论 22.8 后代区间的嵌套
在有向或无向图G的深度优先森林中,节点v是节点u的真后代当且仅当u.d<v.d<v.f<u.f
成立
定理 22.9 白色路径定理
在有向或无向图G=(V,E)的深度优先森林中,节点v是节点u的后代当且仅当在发现节点u的时间u.d,存在一条从节点u到节点v的全部由白色节点所构成的路径。
定理 22.10 无向图的特殊性
在对无向图的深度优先搜索中,每条边要么是树边,要么是后向边 。