Problem
给定一个有向图G,问至少添加几条有向边可以使得G强连通。
Solution
先对G求强连通分支,缩点,然后得到一个DAG。如果最后的DAG只有一个节点,那么答案是0,否则答案是max(in,out),这里in和out分别表示入度为0的点的总数和出度为0的点的总数。
Proof
首先max(in,out)肯定是一个下界,因为至少需要这么多边才能完全消除入度为0的所有的点或者出度为0的所有的点。
接着,我们用归纳法来构造一组合理的解。 给定任意一个图G,求它的强连通分量并且缩点得到一个DAG,令这个DAG为D。我们假设|D|≥2,否则答案很显然是0。令X和Y分别表示D中入度和出度为0的点集。令m=max(|X|,|Y|)。我们通过对m进行归纳,claim是存在一种添加m条边的解法让G变得强连通。
Base: m=1
这个时候,很显然我们有|X|=|Y|=1。假设x和y分别是X和Y的唯一元素,那么我们只需要添加边(y,x)即可。
当m≥2的时候,我们考虑2个case。
Case 1:
存在x∈X, y∈Y使得D不存在从x到y的路径。这时我们添加一条边(y,x)。假设添加过边的新图为G′,求它的强连通分支并且缩点得到一个DAG D′。我们可以断定D′=D∪(y,x)。原因很简单,如果D的点集在添加边(y,x)后发生了变化,唯一的可能是边(y,x)构成了环,这说明我们有x到y的路径,矛盾。
现在考虑新图G′和它的DAG D′,与D相比,D′少了一个入度为0的点,也少了一个出度为0的点,所以m′=m−1。根据归纳假设,我们需要再递归地添加m′−1条边,加上(y,x)本身,一共m条。
Case 2:
不存在上述的x和y,这意味着在DAG D中所有的x∈X都有到所有的y∈Y通路。这时我们可以随意取D中出度为0的点y和入度为0的点x,添加边(y,x)。如此重复m次即可。需要注意的是,如果某个时候不存在出度为0的点,那么就在Y中任取一点,如果不存在入度为0的点,就在X中任取一点。一个合理的推论是,当上述操作完成后,我们有以下两个性质:
i. 对于X中的任何一点x,存在某个y∈Y使得我们有边(y,x)。
ii. 对于Y中的任何一点y,存在某个x∈X使得我们有变(y,x)。
接下来,我们需要证明,为什么这样随意的添加边之后D会变得强连通(因此G也就强连通了)。实际上,任取D中的两个点a和b,首先一定存在某个y1∈Y(y1可能是a本身),使得有a到y1的路径。其次,根据性质(ii),存在某个x1∈X使得我们有边(y1,x1)。再看点b,容易知道一定存在某个x2∈X使得D中存在x2到b的路径(x2可能是b本身)。再根据性质(i),存在某个y2∈Y使得我们有边(y2,x2)。最后,根据一开始的假设,X中的每个点都有到Y中每个点的路径,即存在x1到y2的路径,于是我们找到了一条通路a⇝y1→x1⇝y2→x2⇝b.