算法复习——图算法篇之深度优先搜索
以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!
1. 问题回顾
图的搜索
- 数组结构
- 查询最大值:简单循环搜索所有元素,记录最大值
- 图结构
- 查询相邻顶点:简单循环搜索各顶点关联的边
- 查询可达顶点:简单循环搜索,不能找到全部可达顶点!
因此,我们需要按照特定的次序搜索顶点,于是引出了两种搜索策略:广度优先搜索和深度优先搜索。广度优先搜索可参考算法复习——图算法篇之广度优先搜索。
2. 算法思想
走迷宫问题
算法步骤
- 分叉时,任选一条边深入
- 无边时,后退一步找新边(回溯)
- 找到边,从新边继续深入
辅助数组
- c o l o r color color:用颜色表示顶点状态
- W h i t e White White:白色顶点尚未被发现
- B l a c k Black Black:黑色顶点已被处理
- G r a y Gray Gray:正在处理,尚未完成
- p r e d pred pred:顶点 u u u由 p r e d [ u ] pred[u] pred[u]发现
- d d d:顶点发现时刻(变成灰色的时刻)
- f f f:顶点完成时刻(变成黑色的时刻)
3. 伪代码
DFS(G)
输入:图 G G G
输出:祖先数组 p r e d pred pred,发现时刻 d d d,结束时刻 f f f
新建数组color[1..V], pred[1..V], d[1..V], f[1..V]
// 初始化
for v ∈ V do
pred[v] ← NULL
color[V] ← WHITE
end
time ← 0
for v ∈ V do
if color[v] == WHITE then
DFS-Visit(G, v)
end
end
return pred, d, f
DFS-Visit(G, v)
输入:图G,顶点v
color[v] ← GRAY
time ← time + 1
d[v] ← time
for w ∈ G.Adj[v] do
if color[w] == WHITE then
pred[w] ← v
DFS-Visit(G, w)
end
end
color[v] ← BLACK
time ← time + 1
f[v] ← time
时间复杂度分析<

本文详细介绍深度优先搜索(DFS)算法,包括其基本概念、算法思想、伪代码实现及时间复杂度分析。此外还探讨了DFS在无向图和有向图中的应用特性,如深度优先树、边的分类及白色路径定理。
最低0.47元/天 解锁文章
4353

被折叠的 条评论
为什么被折叠?



