【题解】AT3611 Tree MST

喝,长大了🎵↑↓↑↓

思路

点分治 + kruskal.

对于完全图 MST 问题有一个结论:

G=(V,E),若 E1...Em=E,设 Ei 经过 kruskal 得到的有效边集为 Ei,则对 E1...Em 进行 kruskal 得到的是 G 的 MST。

又发现题目考虑的是树上路径问题,所以想到点分治。

因为点分治可以考虑到树上的每一条路径,它们取并显然可以覆盖所有边,所以可以直接在点分的时候求当前子树的 MST。

因为点分的时候钦定子树重心为根,所以树上路径可以换一种形式写。

depu 表示从当前分治的根结点到点 u 的距离,那么在 (u,v) 之间连边的代价是 wu+wv+depu+depv

可以把贡献拆开,wu+depu 赋给 uv 同理。

那么只需要在子树中找出 wu+depu 最小的点 u,然后子树内的其他所有点都向点 u 连边即可。

那么只需要进行一遍点分就可以找出所有有用的点,直接 kruskal 一次就行。

点分的复杂度是 O(nlogn),所以至多有 O(nlogn) 条边,总复杂度 O(nlog2n)

代码

posted @   kymru  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩