次小生成树

\(\rm 次小生成树\)

一开始只是兴起学一学,思路挺好理解的但是打代码不知道是想复杂了还是怎么的,反正很繁琐,调了一整天

一、定义
非严格次小生成树,即边权和大于等于最小生成树边权和的生成树;严格次小生成树,即边权和大于最小生成树边权和的生成树





二、解法

首先,我们可以证明,次小生成树与最小生成树一定只有一条不同的边。

这是很显然的,因为我们如果选出两条边来替换最小生成树的边,一定是没有只替换一条边优。

那么,对于每一条非树边(u,v),如果我们把它加入生成树,就会形成一个环,我们要从环里删除一条边使仍然构成一棵树,那么要使生成的树边权和尽量小,我们就需要找到这个环里除了边(u,v)外最大的一条边(Q:为什么除了边(u,v)?A:因为这是我们要加进去的边),即原生成树上u到v的路径上边权最大的一条边。这我们可以通过倍增或者树剖实现。

具体而言,用每个点的点权存储其到其父亲的边的边权。但是这样有一个问题,就是说如果u,v不在同一条链上,那么我们要求的其路径上的最大值就是路径(u,v)上不包括lca(u,v)的所有点的点权最大值。那么怎样实现不包括lca呢?

对于倍增,我们只需要使最终求的比lca深度大1即可。

对于树剖,先求出lca,在x不断向lca所在重链链上跳时,如果最终与lca重合,那么所求即为前一步的重链的顶,否则是lca所在重链的下一个点即在线段树上标号+1的数。

\(\rm 思路极其清晰\)

posted @ 2019-12-22 17:17  maskey  阅读(309)  评论(0)    收藏  举报