boruvka
算法相关
流程
我们考虑维护连通块。将最开始的图视为全断开状态,则此时有 \(n\) 个连通块。对于每个连通块,维护其最优势出边,(即从最优的从连通块内的某一点向外连出的一条边)而后合并所有最优势出边的两端点所在的连通块。
合并后,继续循环该流程直至整张图连通块数量为 \(1\)。
因为在每次循环中,每个连通块至少会被合并 \(1\) 次,因此每次循环连通块数量至少减半,所以总时间复杂度 \(O(n \log n)\)。
例题
P3366 【模板】最小生成树
模板。
keyence E - Connecting Cities
简要题意
给定一张图、序列 \(a\) 和定值 \(D\)。一条边 \(i \to j\) 的权值为 \(|i - j| \times D + a_i + a_j\)。求该图的最小生成树。
思路
可以使用分类讨论去掉绝对值,于是我们只做 \(i < j\) 的讨论,\(i > j\) 是类似的。
对于完全图的最小生成树,考虑 boruvka。于是我们只需要找到每个连通块的最优势出边即可。
当 \(i < j\) 时,上述式子可以化为:\(a_i - i \times D + a_j + j \times D\)。假设我们枚举 \(i\),那么答案就是不在点 \(i\) 连通块里的点 \(j\) 的 \(a_j + j\) 的最小值。这个我们可以维护后缀(\(i > j\) 则是前缀)的所属连通块不同的最小、次小值。每次合并最优势出边的两端点即可。
P11307 [COTS 2016] 建造费 Pristojba
简要题意
给定一张图和序列 \(a\),边 \(i \to j\) 的权值是 \(a_i + a_j\)。现有 \(m\) 种无向边 \(x \to [l, r]\),求该图的最小生成树。
思路
那么对于点连向区间,可以在线段树上维护 \([l, r]\) 的 \(a_i\) 所属连通块不同的最小、次小值,只需要判断 \([l, r]\) 的最小次小值哪个和 \(x\) 不在一个连通块即可。
对于区间连向点,对于每一个点 \(i \in [l, r]\) 维护其可达的所属连通块不同最小、次小值即可。对于 \([l, r] \to x\),令当前最小(或次小值)为 \(t_i\),只需对每个 \(i \in [l, r]\) 执行 \(t_i \to \min \{ t_i, a_x \}\) 即可(更新最小值则将原信息传给次小值)。由于只需要区间修改、单点查询,于是可以用类似于标记永久化的思想,每次查询时求答案即可。

浙公网安备 33010602011771号