Kruskal重构树补记

前言

一直以为(Kruskal)重构树是一个冷门数据结构,结果发现(NOI2018Day1T1)(APIO2020T2)中都出现了它的身影。

(Kruskal)重构树一般用于做只能在边权大于等于/小于等于(v)的边上走路之类的问题,它具有许多奇妙的性质。

总而言之,看到瓶颈生成树问题找它就对了。

构建方法

(Kruskal)(MST)的算法应该是众所周知的,而(Kruskal)重构树的构建就建立在这一算法的基础上。

根据(Kruskal)算法的思想,要先将边按边权排序,然后每次选出权值最大/最小且两端尚未连通的边,将这条边加入到(MST)中。

(Kruskal)重构树会把(MST)中的边也看作点,对于每个连通块都要维护一棵二叉树。

每当选出一条新边时,就让它作为它连接的两个连通块的根节点的父亲。

显然,最终会建成一棵由(2n-1)个节点构成的二叉树,而这就是(Kruskal)重构树。

性质

  1. (Kruskal)重构树中的叶节点对应原图中的点,非叶节点对应原图中的边。
  2. 令每个非叶节点的点权为所对应边的边权,根据(Kruskal)重构树的建法,任意一条从非叶节点到根节点的路径,所经点的点权必然是单调的。
  3. 对于原图中的两点(x,y),从(x)(y)的瓶颈就是(Kruskal)重构树中(LCA(x,y))的点权。

重要结论

(x)出发只经过边权大于等于/小于等于(v)的边所能到达的点集,就是(x)深度最小点权大于等于(v)/小于等于(v)的祖先子树内所有的叶节点。(可由性质(3)推导)

实际求解时可以利用性质(2)中点权的单调性倍增上跳(O(logn))求出这个祖先。

例题

【LOJ2718】「NOI2018」归程

原文地址:https://www.cnblogs.com/chenxiaoran666/p/KruskalTree.html