算法复习——图算法篇之深度优先搜索

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

算法复习——图算法篇之深度优先搜索

以下内容主要参考中国大学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

时间复杂度分析<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值