强连通分量
在有向图中,如果顶点v和w相互可达,则称这两个顶点之间强连通。一幅图中任意两点之间强连通则称这幅图为强连通图。有向图的极大强连通子图就是有向图的强连通分量(Strongly Conneted Component)。
强连通有如下性质:
(1)自反性:任意顶点v和自身是强连通的。
(2)对称性:如果v和w是强连通的,那么w和v也是强连通的。
(3)传递性:如果v和w是强连通的且w和x也是强连通的,那么v和x也是强连通的。
强连通分量即是基于强连通的性质,将相互均为强连通的顶点划分在一起构成的最大子集。强连通性是非常重要的抽象,它突出了相互关联的几组顶点(强连通分量),对事物的分类有很大帮助。
Kosaraju算法
Kosaraju算法是求解有向图连通分量较简单的算法,它需要用到原图及其转置图(转置图即所有边的方向与原图一一对应且相反)来进行深度优先搜索。既然强连通是指顶点之间相互可达,那么我们只需要求出原图的连通分量(求解图的连通分量),然后在其转置图中再执行搜寻,原图和转置图对应的每一个连通分量的交集就是我们要求的强连通分量。
在对转置图进行搜寻的过程中,起始顶点的选择需要有所限制,否则可能搜寻到其他连通分量中,这是不允许的(强连通分量只能存在于单个强连通图,即单棵树中)。Kosaraju算法巧妙地选择了“最晚离开的”顶点,因为对任意顶点v和w假设是强连通的,在第一次搜寻过程中已经得到了v→w,那么就需要证明存在路径使得w→v,即证明转置图中存在路径使得v→w。在对转置图进行深度优先搜索的过程中