边双?
有一个问题:给出一张连通的无向图,加上最少的边使得它成为边双连通图
网上有一个结论,就是只要求出边双的缩点树,然后找出其中只与一条边相连的点个数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)(上取整)