强连通分量学习笔记

发布时间 2023-10-11 15:32:58作者: Gao_l

强连通分量学习笔记

一.定义

在有向图G中,如果两个顶点u,v间有一条从u到v的有向路径,同时还有一条从v到u的有向路径,则称两个顶点强连通,如果有向图G的每两个顶点都强连通,称G是一个强连通图,有向非强连通图的极大强连通子图,称为强连通分量.

二.taojian算法 (时间复杂度为\(O(N+M)\))

四条边

  1. 树枝边:DFS时经过的边.
  2. 向前边:与DFS方向一致,从某个节点指向某个子孙的边.
  3. 后向边:与DFS方向相反,从某个结点指向其某个祖先的边.(返祖边)
  4. 横叉边:从某个结点指向搜索树中的另一子树中的某结点的边.

Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。 定义DFN(u)为节点u搜索的次序编号(时间戳),\(Low(u)\)\(u\)\(u\)的子树能够追溯到的最早的栈中节点的次序号。 由定义可以得出,Low(u)=Min {Low(u), Low(v) } (u,v)​​为树枝边,\(u\)\(v\)的父节点 .​ Low(u)=Min {Low(u), DFN(v) }​​\(DFN(v),(u,v)\)为指向栈中节点的后向边(指向栈中结点的横叉边) } 当结点u搜索结束后,若D\(FN(u)=Low(u)\)时,则以u为根的搜索子树上所有还在栈中的节点是一个强连通分量。

算法过程:

从节点1开始\(DFS\),把遍历到的节点加入栈中。搜索到节点\(u=6\)时,\(DFN[6]=LOW[6]\),找到了一个强连通分量。退栈到\(u=v\)为止,\({6}\)为一个强连通分量。

image

初始化时\(Low_u=DFN_u=index+1\)

返回节点5,发现\(DFN_5=LOW_5\),退栈后{5}为一个强连通分量。

image

返回节点3,继续搜索到节点4,把4加入堆栈。发现节点4向节点1有后向边,节点1还在栈中,所以LOW[4]=1。节点6已经出栈,(4,6)是横叉边,返回3,(3,4)为树枝边,所以\(LOW_3=LOW_4=1\).

image

\(Low(u)=\min Low_u, DFN_v\)\(DFN(v),(u,v)\)为指向栈中节点的后向边

继续回到节点1,最后访问节点2。访问边(2,4),4还在栈中,所以LOW[2]=DFN[4]=5。返回1后,发现\(DFN[1]=LOW[1]\),把栈中节点全部取出,组成一个连通分量{1,3,4,2}。

image

至此,算法结束。求出了图中全部的三个强连通分量{1,3,4,2},{5},{6}。

image