强连通分量
强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通。

强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图也可以说,在强连图图的基础上加入一些点和路径,使得当前的图不在强连通,称原来的强连通的部分为强连通分量。

DFS生成树
DFS生成树是根据DFS搜索顺序构成的一颗生成树,形如(自上而下,自左而右):

有向图的 DFS 生成树主要有 4 种边:
树边(tree edge):示意图中以黑色边表示,每次搜索找到一个还没有访问过的结点的时候就形成了一条树边。
反祖边、反向边(back edge):示意图中以红色边表示(即7->1 ),也被叫做回边,即指向祖先结点的边。
横叉边(cross edge):示意图中以蓝色边表示(即 9->7 ),它主要是在搜索的时候遇到了一个已经访问过的结点,但是这个结点 并不是 当前结点的祖先。
前向边(forward edge):示意图中以绿色边表示(即 3->6 ),它是在搜索的时候遇到子树中的结点的时候形成的。可以看出树边其实是一个特殊的前向边。
两者联系
考虑 DFS 生成树与强连通分量之间的关系。
如果结点 u 是某个强连通分量在搜索树中遇到的第一个结点,那么这个强连通分量的其余结点肯定是在搜索树中以 u为根的子树中。结点 u被称为这个强连通分量的根。
反证法:假设有个结点 v在该强连通分量中但是不在以 u为根的子树中,那么 u到 v的路径中肯定有一条离开子树的边。但是这样的边只可能是横叉边或者反祖边,然而这两条边都要求指向的结点已经被访问过了,这就和 u 是第一个访问的结点矛盾了,命题得证。
Tarjan 算法求强连通分量
在 Tarjan 算法中为每个结点 u维护了以下几个变量:
d f n u dfn_{u} dfnu:深度优先搜索遍历时结点 u被搜索的次序。
l o w u low_{u} lowu:能够回溯到的最早的已经在栈中的结点。设以 u为根的子树为 S u b t r e e u Subtree_{u} Subtreeu。 l o w u low_u lowu 定义为以下结点的 dfn的最小值: S u b t r e e u Subtree_u Subtreeu中的结点;从 S u b t r e e u Subtree_u Subtreeu 通过一条不在搜索树上的边能到达的结点。
一个结点的子树内结点的 dfn 都大于该结点的 dfn。
从根开始的一条路径上的 dfn 严格递增,low 严格非降。
按照深度优先搜索算法搜索的次序对图中所有的结点进行搜索。在搜索过程中,对于结点 u和与其相邻的结点 v(v 不是u 的父节点)考虑 3 种情况:
v 未被访问:继续对 v进行深度搜索。在回溯过程中,用 l o w v low_v lowv更新 l o w u low_u


1070

被折叠的 条评论
为什么被折叠?



