C++算法篇:DFS超详细解析(1)--- 无向图基本概念

本文介绍了DFS(深度优先搜索)的概念,它是一种图的遍历方式。通过示例解释了DFS的访问顺序,并对比了与BFS(广度优先搜索)的区别。此外,文章还提供了DFS的基本框架代码,并探讨了DFS-tree,强调了树边和回边的区别。最后,文章简要介绍了无向图的基本知识,包括连通性和桥(割边)的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

①:无向图基本概念
②:tarjan算法求无向图割边


一、DFS是什么?

    DFS(Depth First Search) ,即 深度优先搜索 ,是一种遍历图的方式,对于下图(设从u开始访问)。

若先访问了v点:。

则下一步会访问v的子节点w点:。
发现无路可走,则回溯回v,再回到u,之后前往x。
总结一下,dfs会在搜索到新点时优先访问以改点为起点的子节点,并在所有子节点访问完成后回溯,可以看出,dfs和递归殊途同归
相反地,有BFS(Breath First Search)广度优先搜索,用bfs访问上例时访问顺序为:u,v,x,w,程序会访问完当前节点的所有子节点(不访问孙子节点),在依次访问孙子节点,一层一层向下搜。这里不细表。

二、DFS的基本框架

dfs需要用到递归思想,上代码:

//存图方式:vector(g[N])
void dfs(int u){
   //u:当前节点
	vis[u]=true;
	for(int& v:g[u]){
   //访问u连到的每个节点
		if(!vis[v]) dfs(v);
	}
}

当然,若是想发挥点作用,还需要许多补充。
和大部分递归代码一样,dfs的代码一般也超不过20行,只是重在理解。

三、DFS-tree

我们可以根据上面的代码将一个图改造成一个有向无环图(即树),这里先讨论无向图,对于:。
可以dfs出:。
注意其中绿边和蓝边的区别:

  • 树边:dfs-tree树上的实边
  • 回边:由子节点回到祖宗 (姑且这么叫) 节点,不应该在树上的虚边。
    注意:不存在连向非祖先的回边。

四、图的基本知识

这里主要讨论的是无向图。

  • 表示一个图: G ( V , E ) G (V,E) G(V,E) ,其中, V V V E E E都是集合,表示顶点和边。
    顺带一提, ∣ S ∣ |S| S表示集合S的 .size()
  • 连通:我们称无向图G连通,当对于图上任意两点u,v,都可以找到至少一条 路径 使二点能互相到达。如:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值