谈到算法,图的操作是避免不了。

而我们一般谈到图时,又必定会谈到图的遍历。

图的遍历通常有 2 种,深度优先(DFS) 和广度优先(BFS)。

本篇博文讲解深度优先(DFS)。

图的表示

图有两种表示方式

1. 临接矩阵

其实就是一个权重矩阵,用 1 代表两个结点有连接,0 表示没有连接,这样的表示方式通俗易懂,特别适合稠密图,也就是大多数结点是亮亮连接的情况。

2. 临接表

用一个数组储存所有的顶点的信息,每个顶点又用一个链表或者是数组存放与它相临的结点的信息。

这样的表示方式特别适合稀疏图,也就是比较少的结点之间相互有连接。

本文示例代码用 Python 表示,为了简便,用临接表这种形式表示

DFS 算法思路

其实 DFS 的思路非常简单。

如果你哪天钱包忘记在哪里了,以 DFS 的思路就是,一个房间一个房间找。

先选定一个房间,大致扫一眼,发现没有。

然后,就选择房间里面的办公桌,桌子上没有的话,再去桌子上的柜子里面找。

如果桌子没有,就去床上着。

如果翻遍了所有的角落,也没有那就换个房间。

DFS 图例

上面是一张图,如果要遍历图中所有的结点,又不重复。

可以先选择一个顶点作为根结点,然后沿着路径一条一条遍历下去。

关键词是递归,因为递归需要终止条件,所以另外需要用一个数组记录已经访问过的结点,当一个结点它的临结点都已经访问时,它就需要回溯,这样能避免重复及陷入死循环。

我们首先选择 A.

A 有 2 个临接结点 B 和 C,我们选择先从 B 出发,所以此时路径是

A--->B

现在在 B 结点位置,B 有 3 个临接结点,C、D、F,按照优先往右边走的原则,我们选择 F,所以此时的路径是

A--->B--->F

F 也有 3 个临接点B,D,E,按照从最右边的顺序遍历,我们选择 E,现在路径是:

A--->B--->F--->E

同样的逻辑,在 E 点会选择右边的 C,这时候路径是

A--->B--->F--->E--->C

到达 C 点时,情况有些不同,它的临接点 A 和 B 都已经访问过了,代表这条路径到头了,需要向上回溯。

回溯的过程也是顺着路径往回撤,路径是

A--->B--->F--->E--->C--->E

E 有 2 个临接点,因为 C 点已经访问了,所以 E 可以访问 D.

到了 D 点,D 的临接点都已经访问过,所以 D 也需要往回溯,这种回溯是递归的,最终会回溯到节点 A.

A 是从 B 出发的,按照算法逻辑,这个时候应该从 C 出发了,但是 C 已经被访问了,所以最终整个遍历就结束了。

Python 代码

dfs.py

# G 是临接表的方式表达图形
G={}
G[0] = {1,2}
G[1] = {2,3,5}
G[2] = {0,1,3}
G[3] = {2,4,5}
G[4] = {1,3,5}
G[5] = {1,3,4}# 记录访问过的结点
visited = [False,False,False,False,False,False]
# 结点的别名
names=['A','B','C','D','E','F']def dfs(v):# 打印访问的点print("--->",names[v])visited[v] = Truefor i,value in enumerate(G[v]):# 如果可以访问,最沿着路径一直访问if not visited[value]:dfs(value) if __name__ == "__main__":# 打印图print("Graphy:",G)dfs(0)

最终结果如下:

Graphy: {0: {1, 2}, 1: {2, 3, 5}, 2: {0, 1, 3}, 3: {2, 4, 5}, 4: {1, 3, 5}, 5: {1, 3, 4}}
---> A
---> B
---> C
---> D
---> E
---> F

可以看到,代码可以正常执行,大家亲手实践一下吧。

【小算法】图的遍历之深度优先(DFS)相关推荐

  1. 数据结构之图的遍历:深度优先遍历(DFS)

    图的遍历:深度优先遍历 思维导图: 深度优先遍历的原理: 深度优先遍历的代码实现: 深度优先遍历的性能: 深度优先生成树: 遍历与连通性的关系: 思维导图: 深度优先遍历的原理: ps: 实现方法是递 ...

  2. 【数据结构】图-图的遍历_深度优先遍历(动态图解、c++、java)

    文章目录 一.概述 二.深度优先搜索 算法步骤 递归 非递归 图解 BFS树 代码 邻接矩阵实现 邻接表实现 链式前向星实现 三.完整代码 邻接矩阵版 邻接表版 链式前向星版 四.总结 算法复杂度分析 ...

  3. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  4. 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

    遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...

  5. 图论算法——图的遍历

    图论算法也是非常基础且重要的算法(ps:好像没有不重要的......) 图的基本应用--图的遍历,从具体的题目着手,学习图的遍历方式及代码形式. 我们先来看一下题目,然后再具体分析图的遍历方式. 题目 ...

  6. 图的遍历之深度优先(头歌教学实践平台)

    第1关:骑士周游问题 任务描述 本关任务:编写代码建立骑士周游图,并解决骑士周游问题. 相关知识 为了完成本关任务,你需要掌握: 1.骑士周游问题的基本概念: 2.如何建立骑士周游图: 3.如何实现骑 ...

  7. 深度搜索和广度搜索领接表实现_数据结构与算法--图的搜索(深度优先和广度优先)...

    数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质,为此需要从图的某个顶点出发,访遍图中其余顶点,且使得每一个顶点只被访问一次,这个过程 ...

  8. 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径

    图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...

  9. python 遍历_python实现图广度优先遍历、深度优先遍历

    一.广度优先遍历-BFS 顾名思义,BFS总是先访问完同一层的结点,然后才继续访问下一层结点,它最有用的性质是可以遍历一次就生成中心结点到所遍历结点的最短路径,这一点在求无权图的最短路径时非常有用.广 ...

最新文章

  1. 【小练习06】HTML+CSS--电影公告
  2. IJCAI 2020 | 淡妆浓抹总相宜之人脸上妆
  3. E. Don‘t Really Like How The Story Ends(代码未补)
  4. 268. 缺失数字 golang
  5. android java内存 c内存_Android NDK java和C\C++交互 | 学步园
  6. 基于ADS仿真的465khz检波电路
  7. 二叉树(Java实现)
  8. 微商推广引流秘笈—— 8 个高效的引流策略
  9. JavaScript基础知识总结(1)
  10. Cocos Creator | 碰撞检测优化-四叉树
  11. 打印时候复选框勾选不见了_使用JS实现分页打印(复选框勾选打印)
  12. 什么是3322域名?3322域名如何注册?
  13. Linux工作笔记01
  14. PCIE协议解析 synopsys IP DBI and LBC 读书笔记(5)
  15. 观点:企业需要一个什么样的独立云管平台?
  16. 如何使人变得心胸宽广
  17. linux格式化提示分区被占用,无法格式化D盘提示被占用要怎么解决?D盘无法格式化被占用解决教程...
  18. 计算两张图像之间的PSNR和SSIM值
  19. 新手小白教程之 圈X-QuantumultX 某青极速版自动签到阅读
  20. android gc分析,android GC浅析

热门文章

  1. 简单算法之丢手绢游戏/c++
  2. python批量建立文件夹
  3. MBA-day20 不定方程问题-练习题
  4. 【财富空间】毛日昇:阿里“五新”战略有力助推供给侧结构性改革
  5. 为何两个完全一样的字符串相比较却不一样
  6. java学习笔记--计算器和日历
  7. PMO如何赋能与支撑战略项目管理︱亚马逊PMO负责人宋晓雪
  8. pyHook pyHook3 区别_成熟男人和幼稚男区别,男人不成熟的5个特征
  9. 如何防止uniswap/pancakeswap被机器人夹
  10. 【python】BeautifulSoup的应用