深度优先搜索
数学原理:括号化定理、白色路径定理
树边:
前向边:
后向边:
横向边:
算法伪代码
非递归(使用栈代替递归)
DFS-VISIT:
STACK.push(u)
while ! STACK.empty
u = STACK.top
if u.color == GRAY
u.color = BLACK
time = time + 1
u.f = time
STACK.pop
continue
if u.color == WHITE
u.color = GRAY
time = time + 1
u.d = time
for each v ∈ G:Adj[u]
v.π = u
STACK.push(u)
递归型DFS
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.pre = 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.post = time //访问离开