简介
kruskal重构树是对kruskal算法的拓展,可以看为一种特殊的数据结构。
实践中可以解决一系列涉及可达点的问题。(这话讲了估计也看不懂)
实现思路
在kruskal算法的流程中,当我们将两个点连接在一起时,不进行直接的连接,而是新建一个节点,然后分别连上。
我们将这个节点的点权设为原先两个点之间的边权,最后可以形成一颗树。
不难发现,这样的树满足一些性质:
两点之间路径边权的最大值是他们的lca的权值。
树中的叶子节点是原树中的节点,而非叶节点是新增的节点。
由于是根据kruskal算法的顺序建树,所以非叶节点点权具有单调性。
考虑下面这道题作为应用的例子:
这里只给出如何用kruskal重构树解决边权限制。
首先建出kruskal重构树,然后dfs预处理每个节点能到达的节点范围。
每一次询问的时候我们都从给定的叶节点开始倍增向上跳,直到不满足题意。
找到了目标非叶节点之后主席树查询即可。
总结来说:如果题目涉及对边权的限制,那么可以考虑使用kruskal重构树进行快速求解。不过需要注意的是,不是所有对边权有限制的题目都能用该算法解决。
例题
标签:重构,kruskal,非叶,算法,节点,边权 来源: https://www.cnblogs.com/ilverene/p/11503588.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。