算法导论—基于DFS的图算法

华电北风吹
日期:2016/1/14

深度优先搜索在图论里面也有很多的应用
一、深度优先搜索
深度优先搜索,顾名思义,深,指的是对于当前结点,如果深度增加的时候可以访问到其他节点,那么就先访问深度增加的路线上的节点。
当然,以上只是深度优先搜索的最基本定义,真正使深度优先搜索得到广泛应用的是节点访问的开始时间和结束时间的定义。
在计算开始时间和结束时间的时候需要首先定义一个时间轴,对每一个节点的开始访问和结束访问分别对应时间轴上一个点。
开始时间:开始访问这个节点的时间
结束时间:访问完这个节点所有边表的时间。相当于退出该节点,返回该节点的父节点的时间点。

二、拓扑排序
对于一个有向图进行拓扑排序是深度优先搜索很多应用的基础。
观察深度优先搜索的开始时间和结束时间容易发现,如果存在一条a->b的边,那么b的结束时间肯定要小于a的结束时间,因此,对于对于所有节点深度优先搜索的结束时间从高到低排序即可得到有向图的拓扑排序。
对于有向图中是否存在环,DFS也可以很容易判别,只需要便利过程中判断是否存在后向边即可。

三、强连通分量
对于强连通分量需要一个性质,对于两个强连通分量a和b,如果存在a到b的边(注意,如果存在a到b的边,则必定不存在b到a的边,因为他们是两个强连通分量),那么b的结束时间一定小于a的结束时间(注意,这里连通分量的结束时间指的是其中所有节点完成时间最大值,这也是下面步骤中第二次DFS为什么用转置图的原因)。
利用DFS求强连通分量需要进行两次DFS,一次在原图上,另一次在图转置图上。根据第一次DFS节点的结束时间,一次选择结束时间最长的节点进行第二次DFS。

四、关键路径
关键路径也算是拓扑排序的应用了吧,根据拓扑排序的顺序,对每一个节点的边表的所有边进行松弛操作,最后取所有节点值最大的即可。

五、知识扩展
强连通分量扩展
http://www.68idc.cn/help/buildlang/ask/20150328303825.html

你可能感兴趣的:(算法导论—基于DFS的图算法)