申明
本文的目地是对算法导论中深度优先的内容做一笔记,整体更像该章节的剪辑以及总结。
简介
与图的广度优先遍历比较:
广度优先遍历更多的是能够反应图中点的距离,而深度优先遍历则主要是反映图的形状。
代码以及图示
性质
括号定理
在一个(有向或无向)图G=(V,E)的任何深度优先搜索中,任意两顶点u, v 满足下列性质
区间[d[u], f[u]]和区间[d[v], f[v]]完全不相交,且都不是对方的后裔
区间[d[u], f[u]] 完全包含于区间d[[v], f[v]]中,且 u是 v的后裔
区间[d[v], f[v]] 完全包含于区间d[[u], f[u]]中,且 v是 u的后裔
后裔区间嵌套
在一个(有向或无向)图G=(V,E)的任何深度优先搜索中,任意两顶点u, v ,若v是u的后裔则
d[u] < d[v] < f[v] < f[u]
白色路径定理
在一个(有向或无向)图G=(V,E)的任何深度优先搜索中,任意两顶点u, v ,若v是u的后裔则当且仅当于时刻的d[u]发现u时,可以从顶点u出发经过一条白色路径到达v
边的分类
定义
树边:在深度优先森林Gπ总共的边,如果顶点v是探寻边(u,v)时首次被发现的,那么(u,v)就是一条树边
反向边:深度优先树中,连接顶点u到它的某一祖先的那些边。有向图出现的自环也是反向边
正向边:在深度优先搜索中,连接u和某个后裔的非树边(u,v)
交叉边:同一棵深度优先搜索树的两个顶点之间,条件是其中一个顶点不是另一个顶点的祖先。也可以在不同度优先搜索树之间的顶点之间
性质
树边或前向边,当且仅当d[u]<d[v]<f[v]<f[u]
反向边,当且仅当d[v]<=d[u]<f[u]<=f[v]
交叉边,当且仅当d[v]<f[v]<d[u]<f[u]
结合伪代码颜色变化分析
对于每条边 (u,v),当该边第一次被搜索到时,根据点v的颜色进行区分
白色: 树边
灰色: 反向边
黑色: 正向边或交叉边