$Tarjan$是个很神奇的算法。
给一张有向图,将其分解成强连通分量们。
强连通分量的定义:一个点集,使得里面的点两两可以互相到达,并且再加上另一个点都无法满足强连通性。
$Tarjan$的核心是对于每个点打的标记$dfn$和$low$。
$dfn$的定义:$dfn_u$表示$dfs$时到达$u$的时间。
$low$的定义:$low_u$表示从$u$的$dfs$子树中可以到达的最小的现在还在访问的节点的$dfn$。
然后主要部分就是$dfs$了。
这里要显式地维护一个栈,保存现在在访问中或者在当前节点的$dfs$子树中的所有节点,如果这个节点的$low$和$dfn$相等,则说明它是一个强连通分量的代表元,则一直弹栈直到把自己弹出去为止。这些节点都属于一个强连通分量。