Processing math: 100%
lydxlx

添加最少的边让有向图强连通


Problem

给定一个有向图G,问至少添加几条有向边可以使得G强连通。

Solution

先对G求强连通分支,缩点,然后得到一个DAG。如果最后的DAG只有一个节点,那么答案是0,否则答案是max(in,out),这里inout分别表示入度为0的点的总数和出度为0的点的总数。

Proof

首先max(in,out)肯定是一个下界,因为至少需要这么多边才能完全消除入度为0的所有的点或者出度为0的所有的点。

接着,我们用归纳法来构造一组合理的解。 给定任意一个图G,求它的强连通分量并且缩点得到一个DAG,令这个DAG为D。我们假设|D|2,否则答案很显然是0。令XY分别表示D中入度和出度为0的点集。令m=max(|X|,|Y|)。我们通过对m进行归纳,claim是存在一种添加m条边的解法让G变得强连通。

Base: m=1

这个时候,很显然我们有|X|=|Y|=1。假设xy分别是XY的唯一元素,那么我们只需要添加边(y,x)即可。

m2的时候,我们考虑2个case。

Case 1:

存在xX, yY使得D不存在从xy的路径。这时我们添加一条边(y,x)。假设添加过边的新图为G,求它的强连通分支并且缩点得到一个DAG D。我们可以断定D=D(y,x)。原因很简单,如果D的点集在添加边(y,x)后发生了变化,唯一的可能是边(y,x)构成了环,这说明我们有xy的路径,矛盾。

现在考虑新图G和它的DAG D,与D相比,D少了一个入度为0的点,也少了一个出度为0的点,所以m=m1。根据归纳假设,我们需要再递归地添加m1条边,加上(y,x)本身,一共m条。

Case 2:

不存在上述的xy,这意味着在DAG D中所有的xX都有到所有的yY通路。这时我们可以随意取D中出度为0的点y和入度为0的点x,添加边(y,x)。如此重复m次即可。需要注意的是,如果某个时候不存在出度为0的点,那么就在Y中任取一点,如果不存在入度为0的点,就在X中任取一点。一个合理的推论是,当上述操作完成后,我们有以下两个性质:

i. 对于X中的任何一点x,存在某个yY使得我们有边(y,x)

ii. 对于Y中的任何一点y,存在某个xX使得我们有变(y,x)

接下来,我们需要证明,为什么这样随意的添加边之后D会变得强连通(因此G也就强连通了)。实际上,任取D中的两个点ab,首先一定存在某个y1Yy1可能是a本身),使得有ay1的路径。其次,根据性质(ii),存在某个x1X使得我们有边(y1,x1)。再看点b,容易知道一定存在某个x2X使得D中存在x2b的路径(x2可能是b本身)。再根据性质(i),存在某个y2Y使得我们有边(y2,x2)。最后,根据一开始的假设,X中的每个点都有到Y中每个点的路径,即存在x1y2的路径,于是我们找到了一条通路ay1x1y2x2b.


上一篇 Hello World

Comments