在算法导论的图论算法里,有一个小节讲的是利用两次DFS和一次转置图来求有向图的强联通分量,觉得整个解法很有意思,所以想分享给大家一起瞅瞅。
先修知识:
主要是DFS的运行过程,以及我们将在对某个点完成DFS过程时标记一个完成时间,在这里用十分伪的代码描述一下。
void DFS(Graph G,Vertex u)
{
visit u;
for each Vertex v adjacent to u
if(v is not visited)
DFS(G,v);
u.f = ++time; //我们用f来表示完成时间这一属性,并且我们有一个全局时间变量time
}
主要思路:
不妨先来思考一下,如果我们要得到一个强联通分量,或者说证明我们所选取的分量是强联通分量,该怎么做?
让我们从定义开始,强联通分量里任意两个点互相可以达到。毫无疑问这样是很麻烦的,如果有办法将问题规模缩小到一个点和其他点的关系,问题将会好解决得多。不妨来试一试,假设我们现在已经能够满足,某个特定的点A可以达到分量里任何其他一个点。想到这里,答案就比较清晰了。既然A点能达到其他任何一个点,那如果其他任何一点能达到点A,