C++算法篇:DFS超详细解析(1)--- 无向图基本概念
2021/10/19 22:11:09
本文主要是介绍C++算法篇:DFS超详细解析(1)--- 无向图基本概念,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
系列文章目录
文章目录
- 一、DFS是什么?
- 二、DFS的基本框架
- 三、DFS-tree
- 四、图的基本知识
一、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,都可以找到至少一条 路径 使二点能互相到达。如:
- (无向图的) 连通分量:无向图的极大连通子图,即只要再加入任何一个点都会是该子图不再连通。
- 桥(即割边):删掉该边后图的连通分量个数会增加,如:
则A-E是一个桥。
马上我们会用tarjan算法求图的桥。
THANK YOU !
这篇关于C++算法篇:DFS超详细解析(1)--- 无向图基本概念的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享