图的BFS与DFS的应用

1. BFS的应用

图的BFS算法可以用来求从图中一个顶点到其余各个顶点的最短路径。如果对图中每个顶点都使用一次BSF,就可以求出从图中每个顶点到其余各个顶点的最短路径。

2. DFS的应用

2.1 拓扑排序

DFS算法可以用来求一个有向无回路图的拓扑排序,算法的伪代码如下:

从伪代码中可以看出,图中的各个节点是按完成时间 f 降序顺序排序的。然后依次输出排序后的结果就能得到一个拓扑排序。

2.2 找出图中的所有强联通分支

DFS算法也可以找出一个有向图的所有强连通分支。伪代码如下:

该算法首先调用DFS(G)构造出一个深度优先搜索森林并球出了各个节点的完成时间f[u]。求图G的矩阵表示的转置矩阵GT,然后在GT上再次调用DFS(),但是这次不是按随机顺序任意访问节点,而是按在第一次DFS()中求出的各个节点的f[u]降序顺序访问。这次同样构造出了一个深度优先搜索森林,其中每一棵深度优先搜索树就是一个原图的强连通分支。

读到这里大家也许会奇怪:为什么这个算法有些诡异?为什么一次DFS搞不定?为什么要计算G的转置矩阵?为什么第二次DFS要按f[u]的降序排序?

欲知原因,请参见《算法导论》中文版第339页,有些复杂,不是一两句话能说明白的。

strongly_connected component算法的实现,未完,待续……

原文地址:https://www.cnblogs.com/wanghetao/p/2497334.html