一棵树的生成树有几颗_次小生成树(树剖,生成树)

本文介绍了生成树的概念,包括最小生成树和次小生成树的定义。次小生成树分为严格和非严格两种,可以通过放弃最小生成树的一条边来构造。文章探讨了如何利用树剖等数据结构优化算法,以更高效地找到非严格和严格次小生成树,时间复杂度可达(O(mlogn))。
摘要由CSDN通过智能技术生成

生成树的概念:

在一个无向图中,设顶点数为\(n\),取其中\(n-1\)条边并使所有点相连,所得到的一棵树即为生成树。

最小生成树:

如果还没有接触过生成树的同学,欢迎戳->最小生成树详解

次小生成树:

次小生成树顾名思义,就是边权之和次小的一棵生成树。有严格次小生成树与非严格次小生成树之分。

尽管这个算法的名字叫做次小生成树,不过其实可以理解成一道数据结构

次小生成树可以和次短路径一起理解,有兴趣的同学可以做做模板题

非严格次小生成树的边权之和不一定要比最小生成树的小,即\(Σw\)次≥\(Σw\)最

严格次小生成树的边权之和一定要比最小生成树的小,即\(Σw\)次>\(Σw\)最

想要求出次小生成树?

显然我们可以dfs求出所有的生成树,在排序选出严格次小的就可以了。

但是上述方法显然不能快速求出次小生成树

为了快速的求出来次小生成树,我们需要知道一个结论:次小生成树和最小生成树之间只有一条边的差异。

这一条结论为什么是正确的呢?

我们先来看看\(Kruskal\)是怎么求最小生成树的

\(Kruskal\)是按照边权排序,按照贪心的思路一条一条的加进树边,所以如果要求出次小生成树,那么我们可以放弃一条小的边不选,加入另一条边使图联通。

如果我们"放弃"了两条边,那么只"放弃"一条边的生成树的边权和显然小于"放弃"两条边的生成树的边权和。

所以求出(非)严格次小生成树的朴素算法为:先建立一棵最小生成树。再枚举删去最小生成树上的每一条路径,再在新构成的生成树中选出一棵边权之和最小生成树的即可。

时间复杂度为\(O(nmlogm)\)。当然这种算法还不够优秀,我们可以继续优化

非严格次小生成树我们可以这样优化:

枚举边的时候,枚举没有被并入到最小生成树的边(我们将把这条边加入到生成树中,显然现在的图形不再是一棵树,所以我们要原图中删去一条最大边,使新图仍然联通)

加入边权值为\(W1\)。查询树上每一条的路径,在路径选取一个边权最大值\(W2\)。则当前枚举的答案为\(W−W2+W1\)(W为最小生成树的边权之和)

枚举所有的边之后,取最小值即可。

我们可以用倍增/树剖/LCT来实现查询树上最大值的操作,故复杂度为:\(O(mlogn)\)

再来看看严格次小生成树

不难发现:求非严格最小生成树时,枚举一条边\(W1\)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值