Kruskal重构树入门
这个知识点好像咕咕咕了好长了。。趁还没退役赶紧补一下吧。。
讲的非常简略,十分抱歉。。
前置知识
Kruskal算法
一定的数据结构基础(如主席树)
Kruskal重构树
直接bb好像不是很好讲,那就从这道题入手吧。
在Bytemountains有$N$座山峰,每座山峰有他的高度$h_i$。
有些山峰之间有双向道路相连,共$M$条路径,每条路径有一个困难值,这个值越大表示越难走.
现在有$Q$组询问,每组询问询问从点$v$开始只经过困难值小于等于$x$的路径所能到达的山峰中第$k$高的山峰,如果无解输出$-1$
首先,这是一张图(你在说大实话么)
对于一个点来说,经过困难值小于等于$x$的路径所能到达的点是一定的。
但是这和生成树有啥关系呢?
显然,若一个点能通过一条路径到达,那么我们走最小生成树上的边也一定能到达该节点。
这样我们把最小生成树建出来,就可以少考虑很多边了。
然而并没有什么卵用。。
现在我们需要做的,是找一种方法,能够维护出一个点能到达的点。
于是Kruskal重构树就诞生了。
它的思想是这样的:
在运行Kruskal算法的过程中,对于两个可以合并的节点$(x, y)$,断开其中的连边,并新建一个节点$T$,把$T$向$(x, y)$连边作为他们的父亲,同时把$(x, y)$之间的边权当做$T$的点权
比如说

重构之后是这样的:

这样我们得到了一个新的树,考虑它有什么性质。
其中最重要的一条就是:一个节点能走到的节点一定在它的子树中
然后这道题就做完了,直接dfs序+主席树即可
当然,除了这一条之外,Kruskal重构树还有很多有意思的性质
- 是一个二叉树
- 如果是按最小生成树建立的话是一个大根堆(important!)
- 任意两个点路径上边权的最大值为它们的LCA的点权
例题
Kruskal重构树入门的更多相关文章
- [bzoj 3732] Network (Kruskal重构树)
kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...
- 【BZOJ 3732】 Network Kruskal重构树+倍增LCA
Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- bzoj 3551 kruskal重构树dfs序上的主席树
强制在线 kruskal重构树,每两点间的最大边权即为其lca的点权. 倍增找,dfs序对应区间搞主席树 #include<cstdio> #include<cstring> ...
- kruskal重构树学习笔记
\(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal\) 求最小(大)生成树,树上求 \(lca\). 算法详 ...
- UOJ#407. 【IOI2018】狼人 Kruskal,kruskal重构树,主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ407.html 题解 套路啊. 先按照两个节点顺序各搞一个kruskal重构树,然后问题转化成两棵krus ...
- LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
随机推荐
- Python入门(白银篇)
一.变量.元组的赋值和循环删除 (1)多个变量同时赋值 #多个变量赋值a,b,c,d=1,2,3,4x=y=m=n=520print(a,b,c,d,x,y,m,n) (2)不引入第三方变量下,交换a ...
- SSIS - 11.For循环容器
一.For循环容器中的3个循环变量 For循环容器,类似于编程语言中的For,用于重复执行容器内的任务,直到条件返回为False.与编程语言类似,For循环容器也需要定义以下3种循环属性: 注: 必须 ...
- VUE插件大总结
UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...
- Android 音视频开发(七): 音视频录制流程总结
在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...
- FFmpeg 学习(四):FFmpeg API 介绍与通用 API 分析
一.FFmpeg 相关术语 1. 容器/文件(Container/File):即特定格式的多媒体文件,比如MP4,flv,mov等. 2. 媒体流(Stream):表示在时间轴上的一段连续的数据,比如 ...
- [Swift]LeetCode332. 重新安排行程 | Reconstruct Itinerary
Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...
- [Swift]LeetCode877. 石子游戏 | Stone Game
Alex and Lee play a game with piles of stones. There are an even number of piles arranged in a row, ...
- 什么是 IP 隧道,Linux 怎么实现隧道通信?
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 通过之前的文章 ...
- ThinkPHP 数据库操作(一) : 连接数据库
ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操 作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理.采用 P ...
- scala读取解析json文件
import scala.util.parsing.json.JSON._ import scala.io.Source object ScalaJsonParse { def main(args: ...