强连通分量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
进击的小🐴农