次小生成树

次小生成树

题意理解
要你构造一棵nn个节点的严格次小生成树.

算法解析
分析条件
题目中给出的关键点,就是严格和次小.

什么是严格
就是题目强制要求严格单调性,不可以有=号的出现.

什么是次小
我们应该都知道,最小生成树,它要求边集合的边总和最小,那么次小生成树,要求边集合的边总和只比最小生成树边集合权值大.

总结性质
有至少一个(严格)次小生成树,和最小生成树之间只有一条边的差异

总而言之,言而总之,我们现在知道了这条多余边的加入.,一定会产生非最小生成树.

我们不妨令
ans=最小生成树边权之和

假如说我们将多余边,替换掉最大权值边.
Val1==>z此时我们发现当前生成树

W=ans+z−Val1

W=最小生成边权之和+加上多余边−最大权值边

 

这一轮替换,我们可以认为这棵生成树有潜力成为次小生成树.

然后,我们发现,换一换次大边,也是可以的.

我们将多余边,强行替换掉次大权值边.
Val2==>z此时当前生成树

W=ans+z−Val2

W=最小生成树之和+加入多余边−次大权值边

 

现在所有的候选生成树都出来了,但是我们面临一个非常严重的问题.

我们如何快速计算,一条路径上的最大边,和次大边.

动态规划
我们可以当前需要知道的状态,无非就是两个.

一条路径上的最大边
一条路径上的严格次大边
所以说,我们不妨就按照倍增数组的思路,去制造两个新数组.

最大边数组
严格次大边数组
f[x][k]=f[fa[x][k−1]][k−1]
f[x][k]=f[fa[x][k−1]][k−1]
这是我们非常熟悉的Lca倍增数组.

然后咱们现在其实,手上掌握的最有力的性质,就是最值性质.

我们假设一条路径是由三段构造而成.

是三段,不是就三个点.
a=>c,c=>b,b=>a
a=>c,c=>b,b=>a

次小生成树

 


我们发现
A=>B的最大值其实等于max(A=>C最大值,B=>C最大值)

这就是区间最值性质.

不过严格次大边,就比较麻烦了,不慌,咱们慢慢画图来.

为了下面简述方面,我们设置一下变量.
A=>C上最大边权为ValA,C 次大边权为VA,C

C=>B上最大边权为ValB,C 次大边权为VB,C

A=>B上最大边权为ValA,B次大边权为VA,B

巧计一下,Val字母多,所以是最大边权,V字母少,所以是次大边权.

我们分类讨论一下,三种情况.

①第一段最大值=第二段最大值
ValA,C=ValB,C

我们发现两段居然最大值一样.

次大边权就只能
VA,B=max(VA,C,VB,C)

②第一段最大值<第二段最大值.

那么此时,次大边权是可以取第一段最大值.

因为此时总段的最大值,一定是第二段最大值.
ValA,B=ValB,C因此VA,B可以=ValA,C

综上所述,我们总结下来就是.
VA,B=max(ValA,C,VB,C)

③第一段最大值>第二段最大值.

那么此时,次大边权是可以取第二段最大值.

因为此时总段的最大值,一定是第一段最大值.
ValA,B=ValA,C因此VA,B可以=ValB,C

同样,总结一下.
VA,B=max(ValB,C,vA,B)

然后我们将A,B,C具体化一下.

A其实就是起始节点.

C其实就是A跳跃了2^(i−1)格节点.

B其实就是A跳跃了2^i格节点.

 

上一篇:10_参数数量可变的函数及命令行参数


下一篇:第三讲扩展,VA,RVA,FA(RAW),模块地址的概念