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

Posted golden-elf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给出一张DAG图,问最少加多少条有向边s.t.其强联通?相关的知识,希望对你有一定的参考价值。

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

给出一张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.其强联通?的主要内容,如果未能解决你的问题,请参考以下文章

hdu3251 最小割

POJ 2594 (传递闭包 + 最小路径覆盖)

2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法

leetocode 207 课程表

Graph_Master(连通分量_B_Trajan+完全图)

hdu 1151 Air Raid DAG最小边覆盖 最大二分匹配