本文提纲:
- 问题描述
- Kosaraju 算法
问题描述:
什么是强连通分量(StronglyConnected Component)(或者,被称为强连通子图,Strongly Connected Subgraph)?
首先需要明白的是,强连通分量只可能存在于有向图中,无向图中是不存在强连通分量的,当然,无向图中也有对应物,被称为连通分量(Connected Component),求解无向图中的连通分量,根据具体要求,可以选择使用并查集或者DFS。
看一张取自wiki的图就明白什么是强连通分量了:
以上用虚线围绕的部分就是一个强连通分量,因此上图中总共含有三个。
对于一个强连通分量中的任意一对顶点(u,v),都能够保证分量中存在路径使得u->v,v->u
比如上图中由a,b,e这三个顶点构成的分量中,任意两个顶点间都存在路径可达。
顺便也介绍一下有关“缩点”的概念:
由于强连通分量的特殊性,在一些实际应用中,会将每个强连通分量看成一个点,然后进行处理。这样做主要是为了降低图的复杂度,特别是在强连通分量规模大、数量多的情况中,利用“缩点”能大幅度降低图的复杂度。
缩点后得到的图,必定是DAG。用反正能够很方便的进行证明:因为若图中含有环路,即意味着至少有两个点彼此可达,那么按照强连通分量的定义,这两个点应该属于一个分量中,因而在缩点发生后,会被一个点所代表。由此推导出矛盾。比如,对上图进行缩点处理,最后的结果就是:
设(a,b,c) -> a',(f,g) -> b',(c,d,h) -> c'
因此最后的图就可以表示为:
![](https://img-my.csdn.net/uploads/201301/29/1359467607_9506.png)
更加具体,更加严谨的表述,可以参考:
http://en.wikipedia.org/wiki/Strongly_connected_component