最小生成树

最小生成树

定义无向连通图的最小生成树(MST)为边权和最小的生成树。

只有连通图才有生成树,而对于非连通图,只存在生成森林。

结论

  • 对任意最小生成树,仅保留权值小于 L 的边所得森林的连通性相同。
  • 对于完全图 (V,E) ,若 E=E1E2Ek=E ,则 MST(E)=MST(MST(E1)MST(E2)MST(Ek))
  • MST 的唯一性:对于 Kruskal 算法,只要计算出权值相同的边能放几条,实际放了几条,若两者不同则形成了环,此时 MST 不唯一。
  • MST 上两点路径的最大值即为无向图中两点路径最大值的最小值。

求解

P3366 【模板】最小生成树

Kruskal 算法

按边权升序排序后依次选取边尝试加入 MST,用并查集维护连通性,时间复杂度 O(mlogm)

Prim 算法

维护一个生成树集合,不断向这个集合内加点。

具体的,每次要选择距离当前生成树集合最小的一个结点加入,并更新其他结点的距离。

暴力是 O(n2+m) 的,用堆维护是 O((n+m)logn)

Boruvka 算法

定义一个连通块的最小边为它连向其它连通块的边中权值最小的那一条。

流程:

  • 计算每个点分别属于哪个连通块。
  • 遍历每条边,若两端点不连通,则用该边尝试更新两连通块的最小边。
  • 如果所有连通块都没有最小边,则已经找到了 MST ,否则将各连通块最小边加入 MST。

边权相同时加入第二关键字编号区分边权相同的边。

由于每次迭代连通块数量至少减半,所以时间复杂度是 O(mlogn)

优势在于完全图的求解,每次合并的时候可以把所有点都扫一遍,找到每个点距离最短的连通块,更新最小边。

次小生成树

首先有一个结论:若(严格)次小生成树存在,则总可以和最小生成树只差一条边。

非严格次小生成树

求出原图的 MST 后枚举所有未选的边 (u,v,w) ,找到 MST 上 u,v 路径中边权最大的边,将其替换掉,记录最小值即可。

严格次小生成树

P4180 [BJWC2010] 严格次小生成树

类似的,维护 u,v 路径上边权的次小值,若替换时边权不严格,则使用次小边替换,时间复杂度 $O()

Kruskal 重构树

在 Kruskal 的过程中建立一张新图,对于加入的每一条边都新建一个点, 点权设为这条边的边权,把这条边连接的两个集合设为其儿子,把它作为这两个集合的根。

不难发现这三者等价:

  • 原图中两点简单路径最大边权最小值。
  • MST 上两点简单路径边权最大值。
  • Kruskal 重构树上两点 LCA 的点权。

应用:P4768 [NOI2018] 归程

MST 计数

P4208 [JSOI2008] 最小生成树计数

n100

注意到 MST 有如下性质:

  • 每种权值的边的数量是固定的。
  • 不同的生成树中,某一种权值的边任意加入需要的数量后,形成的联通块状态是一样的。

考虑枚举树边的权值 w ,把权值不是 w 的树边都加入图中后进行缩点,权值为 w 的边在缩点后的图中构造 Laplace 矩阵,利用 Matrix-Tree 定理求出方案数。

应用

CF888G Xor-MST

给定 n 个结点的无向完全图。每个点有一个点权为 ai。连接 i 号结点和 j 号结点的边的边权为 aiaj

求这个图的 MST 的权值。

1n2×1050ai<230

考虑 Kruskal 算法,每次合并两个连通块。

把每个点的权值放在 Trie 树上后,实际就相当于每次选最小边合并左右两棵子树。

一个技巧:把点的权值排序后依次插入,则子树内点的标号就是连续的。

AT_cf17_final_j Tree MST

给出一棵树,现有一张无向完全图,x,y 之间的边权为 wx+wy+dist(x,y) ,求该完全图的 MST。

n2×105

考虑点分治,对于路径过重心的点对 (x,y) ,则其边权为 (wx+dx)+(wy+dy)d 为到重心的距离),因此该部分的 MST 即子树内所有点和 w+d 最小的点连边。可能会出现两个点在同一子树的情况边权会算大,但是不影响答案。

最后将所有 O(nlogn) 边再拿出来做一次 Kruskal 即可,时间复杂度 O(nlog2n)

本题也可以用 Boruvka 做到 O(nlogn)

CF1550F Jumping Around

数轴上有 n 个点,坐标为 a1n 。给定起点 S 和步长 dq 次询问,每次给出 k,T ,表示 x 能跳到 y 当且仅当 |yx|[dk,d+k] ,求 S 是否能跳到 T

n2×105q106

首先可以发现可达性关于 k 是单调的,即 k<k0 时不可达,kk0 时可达。

考虑建出完全图,附上合适的边权满足 k 的单调性。定义两个点 x,y 的边权为 ||axay|d| ,则只要判断 MST 上两点路径的最大边权是否 k 即可。

完全图的 MST 考虑 Boruvka,每次合并维护每个数向左、向右第一个不在连通块的位置,然后双指针扫一遍即可。

时间复杂度 O(nlogn+q)

本文作者:wshcl

本文链接:https://www.cnblogs.com/wshcl/p/18301072/MST

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wshcl  阅读(22)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开