Kruskal重构树补记
前言
一直以为\(Kruskal\)重构树是一个冷门数据结构,结果发现\(NOI2018Day1T1\)和\(APIO2020T2\)中都出现了它的身影。
\(Kruskal\)重构树一般用于做只能在边权大于等于/小于等于\(v\)的边上走路之类的问题,它具有许多奇妙的性质。
总而言之,看到瓶颈生成树问题找它就对了。
构建方法
\(Kruskal\)求\(MST\)的算法应该是众所周知的,而\(Kruskal\)重构树的构建就建立在这一算法的基础上。
根据\(Kruskal\)算法的思想,要先将边按边权排序,然后每次选出权值最大/最小且两端尚未连通的边,将这条边加入到\(MST\)中。
\(Kruskal\)重构树会把\(MST\)中的边也看作点,对于每个连通块都要维护一棵二叉树。
每当选出一条新边时,就让它作为它连接的两个连通块的根节点的父亲。
显然,最终会建成一棵由\(2n-1\)个节点构成的二叉树,而这就是\(Kruskal\)重构树。
性质
- \(Kruskal\)重构树中的叶节点对应原图中的点,非叶节点对应原图中的边。
- 令每个非叶节点的点权为所对应边的边权,根据\(Kruskal\)重构树的建法,任意一条从非叶节点到根节点的路径,所经点的点权必然是单调的。
- 对于原图中的两点\(x,y\),从\(x\)到\(y\)的瓶颈就是\(Kruskal\)重构树中\(LCA(x,y)\)的点权。
重要结论
从\(x\)出发只经过边权大于等于/小于等于\(v\)的边所能到达的点集,就是\(x\)深度最小的点权大于等于\(v\)/小于等于\(v\)的祖先子树内所有的叶节点。(可由性质\(3\)推导)
实际求解时可以利用性质\(2\)中点权的单调性倍增上跳\(O(logn)\)求出这个祖先。
例题
待到再迷茫时回头望,所有脚印会发出光芒