码迷,mamicode.com
首页 > 其他好文 > 详细

边双?

时间:2018-10-06 19:51:23      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:方法   之间   解释   因此   方案   改版   log   box   公共祖先   

有一个问题:给出一张连通的无向图,加上最少的边使得它成为边双连通图

网上有一个结论,就是只要求出边双的缩点树,然后找出其中只与一条边相连的点个数k,答案就是(k/2)(上取整)

网上有一些解释

摘自https://www.byvoid.com/zhs/blog/biconnect

统计出树中度为1的节点的个数,即为叶节点的个数,记为leaf。则至少在树上添加(leaf+1)/2条边,就能使树达到边二连通,所以至少添加的边数就是(leaf+1)/2。具体方法为,首先把两个最近公共祖先最远的两个叶节点之间连接一条边,这样可以把这两个点到祖先的路径上所有点收缩到一起,因为一个形成的环一定是双连通的。然后再找两个最近公共祖先最远的两个叶节点,这样一对一对找完,恰好是(leaf+1)/2次,把所有点收缩到了一起。

摘自评论

想请问对于树1--2; 1--3; 1--4; 2--5; 2--6; 3--7; 3--8; 4--9; 4--10. 来说, 依照上述构造双连通图的方法, 第一步可以选择把叶子(5,10) 连起来, 而LCA(5,10) 是1 (Root), 为最远的. 接着同理, 连接叶子(6,9). 则最后只剩下叶子(7,8) 可选, 此时便出现无解的情况了, 若遇到这种情况是不是会发生问题呢? 似乎采用编号法可以解决这个问题.

好像有一点小问题?怎么证明/构造?

试着再给一个证明(有错的,只是先记一下

首先,k个点中每一个点都必须加一条边,否则不可能使得图边双连通,因此答案的一个下界为将它们两两连接的代价:(k/2)(上取整)

然后给一种构造方法,是以上方法的改版:

每一次找到树中某两个点,然后在这两个点之间连一条边,那么这两个点路径上所有点都可以被缩成一个点

将这些点缩起来,之后仍然为一棵树,且其余只与一条边相连的点不受影响(毕竟绝对不可能被缩进去的),也不会产生新的只与一条边相连的点(除了最后的几次缩点操作之外)(这个真的能够保证吗?给出一种尝试:产生新的只与一条边相连的点,当且仅当两点间的路径上(除两点外)只有最多一个点与路径外的点有最多一条边相连;设法证明每一次都可以避开这样的选择方案(怎么证?))

显然任意一次操作中都能找到这样的两个点,直到只剩1或0个只与一条边的点;只剩1个点时随便找一个点连起来即可

这样每次一定能少掉2个(最后一次可能为1个)只与一条边相连的节点,总代价为(k/2)(上取整)

 

边双?

标签:方法   之间   解释   因此   方案   改版   log   box   公共祖先   

原文地址:https://www.cnblogs.com/hehe54321/p/9748115.html

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