tarjan(u) { Dfn[u]=Low[u]=++Index // 为节点u设定次序编号和Low初值 Stack.push(u) // 将节点u压入栈中 for each (u, v) in E // 枚举每一条边 if (v is not visted) // 如果节点v未被访问过 tarjan(v) // 继续向下找 Low[u] = min(Low[u], Low[v]) else if (v in Stack) // 如果节点v还在栈内(很重要,无向图没有这一步) Low[u] = min(Low[u], Dfn[v]) if (Dfn[u] == Low[u]) // 如果节点u是强连通分量的根 repeat v = Stack.pop // 将v退栈,为该强连通分量中一个顶点 mark v // 标记v,同样通过栈来找连通分量 until (u == v) }