寻找强连通组件 - Kosaraju的算法

时间:2014-01-11 11:07:46

标签: algorithm graph

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

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

1 个答案:

答案 0 :(得分:0)

这不会给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)