对于这个问题,可以简化成以下等价(证明略去)版本:
给出一张n个点的DAG图,图中的点出度(简称cd)或者入度(简称rd)为0,问最少加多少有向条边,s.t.其强联通?
定理1:对于一张n个点的DAG图,图中的点出度或者入度为0,最少只需要加n-1条有向边,就可以使其强联通。
·证明:初始状态下,加入第一条边,至多产生一个强联通分量,并且这个强联通分量中只包含两个点(证明略去)。为了最小化加入有向边的数目,之后加入的有向边,一定不在这个强联通分量内部(因为它不会使得强联通分量的大小增加)。而无论是从这个分量中的任意一点引出一条边,还是引入任意一条边到这个分量中的点,都相当于对这个分量中所有的点进行了操作。于是可以把这个强联通分量缩成一个点,图中点数减一,回到初始状态。不难发现,我们最少只需要加n-1条有向边,或者说至少需要加n-1条有向边,才可以让DAG图中只剩下一个点,这个点就是我们要的强联通分量的缩点。
根据定理1,答案的最小值为n-1。现在只要找到一种对于任意只存在cd=0或者rd=0的点的DAG图都可行的方法,s.t.加入n-1条有向边后整个图强联通,那么n-1就是最终的答案。
1.首先考虑cd=0的点和rd=0的点交集为空,即不存在孤立点。恰好,按照这样构造:假设rd=0的点有a个,cd=0的点有b个,加入a-1条有向边s.t.rd=0的点连成一条链,然后加入b-1条有向边s.t.cd=0的点连成一条链,最后加入一条从cd=0形成的链链尾指向rd=0的链链首的有向边即可(强连通性证明略去)。共添加了a-1 b-1 1=a b-1=n-1条有向边。
2.接着考虑cd=0的点和rd=0的点交集不为空,即存在孤立点。假设孤立点个数为c。孤立点作为链首,加入c a-1条边把孤立点和rd=0且cd!=0的点连成一条链,加入b-1条边把cd=0且rd!=0的点连成一条链,最后从cd=0且rd!=0的点链尾引一条有向边到孤立点和rd=0且cd!=0的点形成的链的链首即可。(强连通性证明略去)共添加了c a-1 b-1 1=a b c-1=n-1条有向边。
还有一种极端情况,假设图中没有边存在,那么就需要加入n条边(相差的这1条边实际上由原图中的边代替了)。
综上,对于任意一张存在边的DAG图,假设其rd=0或者cd=0的点有n个,则只需要加n-1条边就可使其强联通;对于没有边存在的DAG图,则需要加n条边。