在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。
Tarjan算法:
假设图有n个节点,m条边。该算法可以在O(n+m)的时间复杂度中输出所有强连通分量
所用数据结构说明:
数组 dfn[]:记录每个点按照DFS被访问顺序的时间戳
数组 low[]:记录每个点所能访问到的时间戳最靠前的点的时间戳
栈 S:按顺序记录当前DFS树中的节点
算法流程:
tarjan(u){
dfn[u] = low[u] = ++index
S.push(u)
for each (u, v) in E
if (v is not visited)
tar