码迷,mamicode.com
首页 > 其他好文 > 详细

9.21 生成树

时间:2019-09-22 12:55:00      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:覆盖   无限   class   考试   修改   出现   log   生成树   直接   

题意

给定一颗边带权树,求出对于每一条边来说,在保证其出现在最小生成树上的同时,它可能具有的最大边权

若最大边权可以为无限大,输出\(10^9\)


解法

考试时暴力跳链跳了\(98pts\),啊哈哈

首先把最小生成树跑出来,对于每一个非树边,它的答案是其覆盖的树边的边权的最大值;因为这条非树边是可以代替其覆盖的树边中的任意一个的

而对于每一个树边来说,它的答案是所有覆盖它的非树边的边权的最小值,因为这样它既能保证其本身的权值最大又不至于被其他非树边所替代

我们把非树边按边权从小到大排序(实际上由于求的是最小生成树,可以没必要排序)

由于边权已经是从小到大了,所以一个边的答案会由更新它的第一条非树边确定

我们每次在更新完一条非树边覆盖的边的答案时,就用并查集把它们缩起来,避免下次重复遍历到答案已经确定的边;把并查集的根设为深度最小的点

之后的修改操作直接跳到该并查集的根,也就确定了第一个没有被修改的边

至于非树边的答案,倍增求一下即可

复杂度是\(O(N \log N)\)的(如果不管并查集的\(\alpha\)的话)


代码

9.21 生成树

标签:覆盖   无限   class   考试   修改   出现   log   生成树   直接   

原文地址:https://www.cnblogs.com/VeniVidiVici/p/11566921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!