今天我们来聊一下DFS计算有向图的强联通分量Sccs。
老规矩,首先给出Sccs的定义。Sccs是一些节点的集合,该集合中任意两个节点u,v,存在路径u到v,同时也存在路径v到u。
我们来看一个示意图
我们看,a点存在一个到b的路径,b可以通过e点到达a。因此a b e构成了一个Sccs。
那么我们如何求解一个图中的Sccs呢?
首先,我们将上图中的Sccs缩成一个点,来看看。
我们可以看到,将Sccs缩成一个点之后,示意图变简单了不少。如果我们对简化过后的示意图来进行搜索的话,我们可以看到如果我们先搜索S1中的点,可能搜着搜着就到S2或者S3中了。反之如果我们先搜索S3中的点,则不会跑到S1或者S2中。这是一个非常重要的发现。而这个S3看起来是不是感觉很熟悉?是不是我们拓扑排序里面提到的sink node?但是拓扑排序不是使用在有向无环图中吗?是的,那是针对排序而言。这里,我们可以借助这个思想嘛。
收到sink node的启发,kosaraju算法主要就是考虑,先把图中的节点按照拓扑排序的思路先排一个顺序。同一个Sccs中的点由于形成一个环,因此他们之间顺序无所谓。但是Sccs本身的点需要有一个大的顺序。如S