冗余路径

对一个e-DCC来说,由于任意一条边都被包含在一个简单环中,所以任意两个点我们都可以构造出两条不相交的路径,如下

也就是把每一条边都替换成简单环的另一条路径

而对于位于不同的e-DCC的点显然是有必经边的

于是这道题目就转化成一个模型:给连通的无向图加边,使得无向图没有桥(即变成边双连通分量),最小化加边数

因为边双连通分量本来就没有桥,所以我们考虑对整个图求一遍边双连通分量(使用 tarjan 算法),然后将边双连通分量缩为一个点考虑。那么缩完点后得到的图一定是一棵树(因为图中不可能存在环)

然后要加的边的个数就是cnt2,其中cnt是图中度数为1的点数

先证这是下界

对于缩点之后的树,如果我们的操作没有涉及某个叶子(注意这里是叶子而不是度数为1的点),那么这个叶子一定就会一直待在这里直到我们某次操作涉及它;也就是说每个叶子都会被操作至少一次;如果根节点的度数为1,那么根节点下面一小部分是一条链,在操作涉及根节点之前是不可能把这条链给合并了的(有可能把链的长度缩短),也就是说此时根节点也会被操作至少一次。综上,最小操作次数就是cnt2

然后构造一下:

直接考虑节点数量在2以上的情况,我们任选一个度数大于1的点(一定找得到)作为根节点,然后这棵树就长这个样子:

每个子树都有若干个叶子,数目设为a1a2,...,an(假设已经从大到小排好序了)

我们每次选择不同的子树的两个叶子连边(这么做的原因就是因为每次连边的点的LCA都是根节点),相当于把序列{a}中选两个数1

先假设i=1n1aian

我们每次操作都让a中最大的数和最小的数进行减一(中间注意动态调整),我们先来论证这种操作在任意时刻都是可能的

an变成跟an1相等之前,式子i=1n1aian恒成立,所以一定能从前n1个数找到最小的与an同时减一;如果某时刻an=an1,如果此时i=1n1aian,那么再进行一次操作之后,an1就会变成最大的,但是仍然满足“最大值不超过其余所有数的和”,就回到了之前的过程,否则的话此时有i=1n1ai=an,由于an是最大值且an=an1,所以i=1n2ai=0,也就是说前n2个数全为0,接下来的操作就是不断操作剩余的两个数就好了

由于数是有限的,最后要么全部变为0,要么还剩下一个1

对于前面一种情况,此时就已经符合题意了,对于后面一种情况,此时在让这个叶子节点与根节点进行连边即可,不难算出添加的边数是以上结论给出的式子

如果i=1n1aian怎么办?

此时,我们换根,让an所对应的子树的顶点作为根,直到对应的序列满足i=1n1aian

证毕

这种每次按照单位数量选两个减的好像都是让最大的和最小的减,然后中途动态调整

一模一样的

update 2024.8.4

证明过程中,对数列a每次选取两个不同的数减一,这是一个很重要的模型

比如Colored Balls,而Ans && Conclusion给出了更简单的一种证明

posted @   最爱丁珰  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示