寻找强连通分量 - Kosaraju 算法

Posted

技术标签:

【中文标题】寻找强连通分量 - Kosaraju 算法【英文标题】:Finding strongly connected components - Kosaraju’s Algorithm 【发布时间】:2014-01-11 11:07:45 【问题描述】:

在有向图中,为了找到强连通分量(使用 Kosaraju 算法),如果我们可以在完成时间之前使用反向节点列表然后遍历原始图,为什么我们必须转置邻接矩阵(反转所有边的方向) . 换句话说,我们会找到所有顶点的完成时间并开始从最低完成时间遍历到最大完成时间(通过增加完成时间)?

此外,如果我们对某个 DAG 进行拓扑排序,然后反转边(转置邻接矩阵)并再次进行拓扑排序 - 我们是否应该得到相等的数组,只是以相反的顺序?

【问题讨论】:

【参考方案1】:

这不会产生 SCC。考虑 2 个子图 S1 和 S2。为了使 S1 和 S2 都成为单个 SCC 的一部分,应该有一条从 S1 到 S2 以及从 S2 到 S1 的路径。您提到的方式,即使只有从 S1 到 S2 的路径,它也会将它们视为单个 SCC。 原始图和反向图上的 DFS 确保只有具有双向路径的组件才能在 SCC 内组合。

此外,如果我们对某个 DAG 进行拓扑排序,然后反转边(转置邻接矩阵)并再次进行拓扑排序 - 我们是否应该得到相等的数组,只是以相反的顺序?

不一定。考虑一个简单的例子(1->2,1->3)。拓扑排序=(1,2,3)。反转图 (2->1,3->1)。拓扑排序(2,3,1)

【讨论】:

以上是关于寻找强连通分量 - Kosaraju 算法的主要内容,如果未能解决你的问题,请参考以下文章

Algorithms IV求解强连通分量 Kosaraju算法

Kosaraju算法——强连通分量

强连通分量 (kosaraju算法+tarjan算法)

图的强连通分量-Kosaraju算法

Kosaraju两次深搜实现强连通分量

强连通分量-----Kosaraju