tarjan有向图的强连通分量
有向图强 连通分量 :在 有向图 G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点 强连通 (strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个 强连通图 。有向图的极大强连通子图,称为强连通分量(strongly connected components)。 通过对强连通分量的缩点,可以将任意一个有向图变成一个有向无环图(DAG)。 我们将边分为四类:1.树枝边(x是y的父亲结点)2.前向边(x是y的祖先结点)3.后向边(x是y的子孙结点)4.横叉边(连向其他分支的并且已经搜过的边) 可以看出,树枝边是前向边的特殊情况。 如何判断x所在的位置在哪个强连通分量中? 情况1: 存在一条边后向边,指向祖宗结点。 情况2: 先由该点通过横叉边走到另一个分支,再由分支走到该点的某个祖宗结点上。 这里用tarjan算法求强连通分量。我们引入一个时间戳的概念,如上图,用dfs对其进行编号。 对每个点定义两个时间戳dfn[u]和low[u]表示从u开始走,所能遍历到的最小时间戳是什么。如果u是其所在的强联通分量重的最高点,等价于 dfn[u] == low[u] 。 可以证明,通过dfs搜图,能得到该图拓扑图的逆序,tarjan就是按照dfs的顺序搜索,所以