例6-1是深度优先搜索的C++的实现。注意顶点的颜色信息只是在dfs_search和dfs_visit中使用。
例6-1:深度优先搜索实现
如果d和f不需要,那么这些值的计算过程(以及将其作为函数参数)可以从例6-1中的代码删除掉。深度优先搜索可以得到关于图中边的额外信息。尤其,在深度优先森林中,有四种边。
树边
对于所有pred[v]=u的顶点v,dfs_visit(u)访问边(u,v)来遍历图。这些边记录了深度优先搜索的进程。图6-10中的边(s,1)就是一个很好的例子。
后边
当dfs_visit(u)处理到顶点v时,如果v是u的邻接顶点并且是灰色,那么深度优先搜索就会知道它已经访问过这个顶点。图6-10中的边(8,s)就是一个很好的例子。
前边
当dfs_visit(u)处理到顶点v时,如果v是u的邻接顶点,v的颜色是黑色,而且u在v之前被访问,那么边(u,v)是一个前边。那么深度优先搜索就会知道它已经访问过这个顶点了。图6-10中的边(5,9)就是一个很好的例子。
交叉边
当dfs_visit(u)处理到顶点v时,如果v是u的邻接顶点,v的颜色是黑色,而且u在v之后被访问,那么边(u,v)是一个交叉边。交叉边只是在有向图中存在。
标记这些边的代码在例6-1中。对于无向图,边(u,v)可能会被标记很多次,但是一般来说,只有在这条边第一次被标记时其标记有效。