深度优先搜索 DFS 算法摘记
来源:互联网 发布:投诉数据分析 编辑:程序博客网 时间:2024/04/28 04:38
图的表示
对于图G=(V,E),可以用两种标准表示方法表示。一种表示法是将图作为邻接链表的组合,另一种是将图作为邻接矩阵来看待。
邻接链表
邻接链表表示由一个包含|V|条链表的数组Adj所构成,每个结点有一条链表。对于每个结点u,邻接链表Adj[u]包含所有与结点u之间有边相连的结点v。邻接链表在表示稀疏图上很有优势。邻接链表的一个潜在缺陷是无法快速判断一条边(u,v)是否是图中的一条边,唯一的方法是在邻接链表Adj[u]里面搜索结点v。邻接矩阵克服了这个缺陷,但付出的代价是更大的存储空间消耗。
邻接矩阵
对邻接矩阵表示来说,我们通常会将图G中的结点编为1、2、……、|V|,这种编号可以任意。在进行编号之后,图G的邻接矩阵表示一个|V|*|V|的矩阵A=(aij)予以表示,该矩阵满足下述条件:
aij=1 if (i,j)属于E;否则 aij=0.
关于图的两种表示的一个例子如下所示,其中(b)为链表,(c)为矩阵表示。
DFS算法的过程:
过程DFS执行如下。
第1-3行把所有结点置为白色,所有π域初始化为NIL。第4行复位全局变量time,
第5-7行依次检索V中的结点,发现白色结点时,调用DFS_Visit去访问该结点。每次通过第7行调用DFS_Visit时,结点u就成为深度优先森林中一棵新树的根,当DFS返回时,每个结点u都对应于一个发现时刻d[u]和一个完成时刻f[u]。
每次开始调用DFS_Visit(u)时结点u为白色,第1行置u为灰色,第2行使全局时间变量增值并存于d[u]中,从而记录下发现时刻d[u],
第3-6行检查和u相邻接的每个顶点v,且若v为白色结点,则递归访问结点v。
在第3行语句中考虑到每一个结点v∈Adj[u]时,我们可以说边(u,v)被深度优先搜索探寻。
最后当以u为起点的所有边都被探寻后,第7-8行语句置u为黑色并记录下完成时间f[u]。
主要参考:算法导论
- 深度优先搜索 DFS 算法摘记
- 深度优先搜索(DFS)算法
- 算法 DFS深度优先搜索
- DFS(深度优先搜索算法)
- 深度优先搜索(DFS)算法
- DFS深度优先搜索算法
- 深度优先搜索(DFS) 算法
- DFS深度优先搜索算法
- 深度优先搜索DFS算法
- 深度优先DFS搜索算法
- (DFS算法)深度优先搜索算法
- 【算法入门】深度优先搜索(DFS)
- 【算法入门】深度优先搜索(DFS)
- 【算法入门】深度优先搜索(DFS)
- 【算法】深度优先搜索(DFS)I
- 【算法】深度优先搜索(DFS)II
- 【算法】深度优先搜索(DFS)III
- 【算法】深度优先搜索(DFS)IV
- grub手动引导、修复win7 Mbr
- linux c 线程的创建与结束 (传参和返回值)
- Unable to create requested service [org.hibernate.engine.spi.CacheImple
- make 2>&1 | tee build.log 解释
- 怎么判断数据库连接超时
- 深度优先搜索 DFS 算法摘记
- weblogic启动项目报错
- springMvc 静态文件问题
- ffmpeg 截取视频中任意一帧或多帧图片
- 123123
- Vim 配置
- 临时文档11--字符串
- Problem C. Sorting---Round A China New Grad Test 2014
- C++与lua表交互的方法