7.3.1深度优先搜索

定义

  • 类似于树的先根遍历,但访问结点前要判断此节点是否被访问过。
  • 深度优先遍历过程
    假设初始状态是一个无向图中所有的结点都未被访问,
    从图中某个顶点 v 出发,访问此顶点,
    然后依次对 v 的 未被访问的邻接点 进行 深度优先遍历图(递归),直至图中所有和 v 有路径相通的顶点都被访问到;
    若此时图中还有顶点未被访问,则另选图中未被访问的顶点为始点,重复上述过程,直至所有的顶点都被访问过。
    (对每个结点来说都是一个递归的过程)

图例

  • 对 G4 进行 深度优先遍历
    在这里插入图片描述
    假设从顶点 v1 出发进行搜索,
    在访问了顶点 v1 之后,选择邻接点 v2
    v2 未曾被访问,从 v2 出发进行搜索。
    以此类推,依次访问 v4 ,v8 ,v5
    由于 v5 的邻接点都已被访问过 ,因此从 v5 返回 v8 。同理依次返回到 v4 ,v2 ,v1
    v1 的另一个邻接点 v3 未被访问,接下来依次访问 v3 ,v6 ,v7

  • G4 深度优先搜索的顶点访问序列
    v1 -> v2 -> v4 -> v8 -> v5 -> v3 -> v6 -> v7

  • 在访问过程中,为了区分顶点是否已经被访问,需附设访问标志数组 visited [ 0 … n-1 ]

深度优先遍历算法

Boolean visited[MAX]; // 访问标志数组
Status (*VisitFunc)(int v); // 函数变量

// 对 图G 做深度优先遍历
void DFSTraverse(Graph G, Status (*Visit)(int v))
{
	VisitFunc = visit;
	// 访问标志数组初始化
	for(v=0; v<G.vexnum; v++)
	{
		visited[v] = FALSE;
	}
	// 防止是非连通图,遍历所有结点
	for(v=0; v<G.vexnum; v++)
	{
		if(!visited[v])
		{
			DFS(G, v);
		}
	}
}

// 从 图G 的第 v 个顶点出发,递归深度优先遍历图 G
void DFS(Graph G, int v)
{
	visited[v] = TRUE;
	VisitFunc(v);
	for(w=FirstAdjVex(G, v)
			w>=0;
			w=NextAdjVex(G, v, w))
	{
		if(!visited[w])
		{
			DFS(G, w);
		}
	}
}
  • 遍历图的实质
    对每个顶点查找其邻接点的过程,
  • 耗费的时间取决于所采用的存储结构
    当用二维数组表示邻接矩阵作为图的存储结构时,查找每个顶点的邻接点所需时间是 O( n2 )
    采用邻接表存储结构时,查找每个顶点的邻接点所需时间为 O( e ),深度优先搜索遍历图的时间复杂度为 O( n + e )。访问过的顶点不会再访问,因此访问顶点本身的时间复杂度为 O(n)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值