严格次小生成树

严格次小生成树算法及模板

 所谓次小生成树,即边权之和第二小的生成树,但所谓严格,就是不能和最小的那个相等。

求解严格次小生成树的方法一般有倍增和LCT两种。当然LCT那么高级的我当然不会,所以选择用倍增来解。

用倍增解LCA就好像是一个模板的大杂烩,其实质就是最小生成树(kruscal)+ 倍增LCA

总体思想

之前利用并查集来求解最小生成树的时候曾经提到过,如果再往生成树添加一条边,那么一定会出现环。因此我们的给出以下定义:称加入最小生成树的边为树边,其他的为非树边。我们枚举每一条非树边,加入到它对应的环里。将一条非树边加入后,必定需要删除一条环内的边。因为要求的是次小,所以一定把最大的删去,再加上这条边,以此来保证增加的权值最少。设最大的这条边权值为q,最小生成树的权值总和为ans,则本次的结果就是ans-q+当前边。每条边打擂最小值即可。

以上的方法貌似很完美,但缺点是没有保证严格。如果加入的边恰好与最大的边相等,那么求解出来的答案必定不是严格的次小。因此如果出现了相等的情况,就需要特殊处理。如何处理?由于我们必须保证有所超出,所以应当删去原树内次大的边。设次大的这条边权值为p,这本次的结果就是ans-p+当前边。

总结一下,如下:

if(最大边 < 当前边) res = ans-最大边+当前边;

else if(最大边 == 当前边) res = ans-次大边+当前边;

没有可能出现 最大边 > 当前边 的情况? 那你一定是最小生成树求错了!既然是最小生成树了,这条比最大边还小的边怎么可能存在!!!

如何求解最小生成树中任意两点之间边权的最大值与次大值?

这也就是问题的关键。

扫描二维码关注公众号,回复: 1782899 查看本文章

 

猜你喜欢

转载自www.cnblogs.com/qixingzhi/p/9242949.html
今日推荐