强连通分量Korasaju算法

强联通分量指的是有向无环图中的一个子图,该子图中任意两个节点i、j,都存在i到j的路径和j到i的路径,换句话,该子图中任意两点有路径可达(不需要直接有边相连,可以通过多条边)。

对于原图G做DFS,每个节点回溯时压到一个栈里。

对原图取转置,记G'。对于G'按之前栈的次序取栈顶进行DFS,每次得到的子图就是一个强联通分量。

例子:

图G:

 按照上述步骤:

首先对原图G做dfs:

起点1:1-2-4-6,6回溯,入栈。

1-2-4,4回溯,入栈。

1-2,2回溯,入栈。

1-3-5,5回溯,入栈。

1-3,3回溯,入栈。

1,1回溯,入栈。

得到的栈为:【底】----->【顶】6-4-2-5-3-1

3.按照栈顶->栈底的顺序对于转置图G'做dfs

转置图G’:

起点1:1-4-2-3

起点5:5

起点6:6

最终得到3个强连通分量:

第一个:1,2,3,4

第二个:5

第三个:6

 

posted @ 2020-05-27 00:24  NeoZy  阅读(238)  评论(0编辑  收藏  举报