码迷,mamicode.com
首页 > 移动开发 > 详细

给出一张DAG图,问最少加多少条有向边s.t.其强联通?

时间:2019-11-15 22:32:11      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:缩点   一点   强联通   under   增加   str   根据   连通   方法   

对于这个问题,可以简化成以下等价(证明略去)版本:

给出一张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条边。

给出一张DAG图,问最少加多少条有向边s.t.其强联通?

标签:缩点   一点   强联通   under   增加   str   根据   连通   方法   

原文地址:https://www.cnblogs.com/Golden-Elf/p/11869643.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!