[Tarjan系列] Tarjan算法与有向图的SCC
前面的文章介绍了如何用Tarjan算法计算无向图中的e-DCC和v-DCC以及如何缩点。 本篇文章资料参考:李煜东《算法竞赛进阶指南》 这一篇我们讲如何用Tarjan算法求有向图的SCC( 强连通分量 )已经如何缩点。 给定一张有向图,若对于图中任意两个节点x和y, 既有x到y的路径,又有y到x的路径,则该有向图是一张“强连通图”。 有向图的极大连通子图被称为“强连通分量”,即SCC。 一个环一定是强连通图。如果既有x到y的路径,又有y到x的路径,那么x和y就一定在一个环中。 这就是Tarjan算法的原理:对于每个点x,找到与它一起能构成环的所有点。 下面介绍有向图中的三种边(x,y): 1. 树枝边:搜索树中x是y的父节点 2. 前向边:搜索树中x是y的祖先节点 3. 后向边:搜索树中y是x的祖先节点 4. 横叉边:除了以上三种情况外的边,满足dfn[y]<dfn[x] 这里只给出简单定义,不再赘述。 我们可以发现,用Tarjan算法求SCC时,后向边(x,y)可以和搜索树上从y到x的路径构成一个环。 除后向边外,通过横叉边也可能找到一条从y出发能回到x的祖先节点的路径。 那么为了找到通过横叉边和后向边构成的环,Tarjan算法在dfs的过程中维护一个栈,当访问到节点x时,栈中需要保存以下两类节点: 1. 搜索树上x的祖先节点,记为集合anc(x)。设y∈anc(x)