Kruskal重构树入门

这个知识点好像咕咕咕了好长了。。趁还没退役赶忙补一下吧。。php

讲的很是简略,十分抱歉。。html

前置知识

Kruskal算法算法

必定的数据结构基础(如主席树)数据结构

Kruskal重构树

直接bb好像不是很好讲,那就从这道题入手吧。spa

在Bytemountains有$N$座山峰,每座山峰有他的高度$h_i$。htm

有些山峰之间有双向道路相连,共$M$条路径,每条路径有一个困难值,这个值越大表示越难走.blog

如今有$Q$组询问,每组询问询问从点$v$开始只通过困难值小于等于$x$的路径所能到达的山峰中第$k$高的山峰,若是无解输出$-1$get

首先,这是一张图(你在说大实话么)io

对于一个点来讲,通过困难值小于等于$x$的路径所能到达的点是必定的。import

可是这和生成树有啥关系呢?

显然,若一个点能经过一条路径到达,那么咱们走最小生成树上的边也必定能到达该节点。

这样咱们把最小生成树建出来,就能够少考虑不少边了。

然而并无什么卵用。。

如今咱们须要作的,是找一种方法,可以维护出一个点能到达的点。

因而Kruskal重构树就诞生了。

它的思想是这样的:

在运行Kruskal算法的过程当中,对于两个能够合并的节点$(x, y)$,断开其中的连边,并新建一个节点$T$,把$T$向$(x, y)$连边做为他们的父亲,同时把$(x, y)$之间的边权当作$T$的点权

好比说

 

重构以后是这样的:

 

这样咱们获得了一个新的树,考虑它有什么性质。

其中最重要的一条就是:一个节点能走到的节点必定在它的子树中

而后这道题就作完了,直接dfs序+主席树便可

 

固然,除了这一条以外,Kruskal重构树还有不少有意思的性质

  1. 是一个二叉树
  2. 若是是按最小生成树创建的话是一个大根堆(important!)
  3. 任意两个点路径上边权的最大值为它们的LCA的点权

例题

[NOI2018]归程

相关文章
相关标签/搜索