深度优先搜索 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]。



主要参考:算法导论

0 0