kruskal 重构树

算法相关

实现

  1. 将无向图的边按边权排序。
  2. 枚举排序后的边 \(e\),若 \(e\) 的两个端点 \(x, y\) 不连通,那么新建节点 \(p\),点 \(p\) 连接 \(x, y\) 所在连通块的根,将 \(p\) 的点权设为 \(e\) 的边权。
  3. 枚举结束后,得到的一棵树成为 kruskal 重构树。

性质

  1. 原图中的 \(n\) 个点都是树上的叶子节点。
  2. 树上共 \(2 \times n - 1\) 个点。
  3. 除开叶子,具有堆的性质。
  4. kruskal 重构树任意子树内的节点,在原图中可以不依赖子树外的点连通。

其中性质 \(2\) 是一个非常重要的性质,它代表着 kruskal 重构树上具有单调性。依次我们可以在重构树上结合二分、倍增等手法解题。

例题

P1967 [NOIP 2013 提高组] 货车运输

思路

建出 kruskal 重构树,跳 LCA 即可。

P2245 星际导航

和上题一样。

P4197 Peaks

思路

对于路径权值的限制,用 kruskal 重构树解决;对于可达第 \(k\) 小,按深度建可持久化线段树即可。

Div. 2 E. Qpwoeirut and Vertices

思路

经典结论:

\[\displaystyle \operatorname*{LCA}_{i = l} ^ r i = \operatorname{LCA}(\operatorname*{avgmin}_{i = l} ^ r dfn_i, \operatorname*{avgmax}_{i = l} ^ r dfn_i) \]

因此把一个区间查询转化为了两个单点查询。跳 LCA 即可。

AGC D - Stamp Rally

思路

二分答案,而后分别把两个点倍增即可。

P4768 [NOI2018] 归程

思路

同样是用 kruskal 重构树解决边权限制和强制在线。那么接下来只要考虑一件事:怎样在重构树上点权不超过 \(k\) 的点的子树里求到 \(1\) 号点的最短路。

在原图上跑最短路,由于 kruskal 重构树的单调性,我们只需要倍增求答案即可。

P4899 [IOI 2018] werewolf 狼人

简要题意

给定一个无向图,每次给出询问 \((s, t, l, r)\),问是否存在一条起点为 \(s\),终点为 \(t\) 的路径满足先经过大于等于 \(l\) 的点再经过小于等于 \(r\) 的点。

思路

先拆点,这样可以将点权转化为边权。那么这样很符合 kruskal 重构树的形式。那么可以建出一个最小重构树和最大重构树。对这两棵树分别跳到 \(l, r\) 的位置,问题转化为这两棵子树的叶子节点是否有交。

叶子的交集本质上是子树的交集。因此可以用 dfs 序刻画。记一个点在两棵树上的 dfs 序是 \((x, y)\),那么答案合法则要求 \(x \in [l_1, r_1], y \in [l_2, r_2]\)。这是一个二维数点的形式,离线下来即可。

P3684 [CERC2016] 机棚障碍 Hangar Hurdles

简要题意

你正在评估一些关于一个巨型飞机仓库的建设计划。飞机仓库的地面可以表示为 \(n\)\(n\) 列的网格图,其中每个格子要么是空的,要么有障碍物。行从上到下依次被编号为 \(1\)\(n\),列从左到右依次被编号为 \(1\)\(n\)

存放飞机零件的大型集装箱能在飞机仓库的地面上自由移动是很重要的。我们可以将每个集装箱看作一个以某个格子为中心的边平行于坐标轴的正方形。对于一个奇数 \(k\),一个尺寸为 \(k\) 的集装箱是一个包含 \(k\)\(k\) 列的正方形。一个集装箱的坐标为其中心格子的坐标。集装箱可以向上下左右移动,但不能碰到障碍物,且不能移出仓库的边界。

给定 \(q\) 对格子 \(A_k\)\(B_k\),对于每对格子,请找到能从 \(A_k\) 移动到 \(B_k\) 的集装箱的最大尺寸,注意这个尺寸也要是一个奇数。

思路

首先把每个点点权赋为以该点为中心的集装箱最大尺寸,然后每个点向四周连边,建 kruskal 重构树。找两个点的 LCA 即可。

至于如何找集装箱的最大尺寸,直接二分 + 前缀和 check 即可。

P10054 [CCO 2022] Phone Plans

P5168 xtq玩魔塔

P9984 [USACO23DEC] A Graph Problem P

posted @ 2025-07-26 20:21  endswitch  阅读(170)  评论(0)    收藏  举报