最小斯坦纳树

概念

P6192 【模板】最小斯坦纳树

对于无向图 G=(V,E),记其关键点集合为 S。试在图中选出一边集 E,使得图 G=(V,E)(其中 SV)为连通图且 (i,j)Ewi,j 最小。易看出满足条件的图 G 为一棵树(反之删去环上任意一边边权总和更小),符合以上性质的生成树称为最小斯坦纳树。

思路

|S| 较小时,最小斯坦纳树可以通过状压 dp 求解。

考虑令 f[i][s] 表示以 i 为生成树的树根,生成树中的关键点集合为 s 时的最小边权总和。分类讨论:

i 有多棵子树时,考虑枚举最后添加的一棵子树,有 ss,f[i][s]=min(f[i][ss]+f[i][s])。直接枚举子集的复杂度是 O(3n)

i 只有一棵子树时,易知 (i,j)E,f[i][s]=min(f[j][s]+wi,j)。联想到最短路,容易看出这个式子实际上可以通过松弛转移(以 f[][s] 为距离数组)。据说用 SPFA 会比 Dijkstra 快(不知道什么原理

时间复杂度是 O(i=02|S|3i+nlogn)

代码

变式

最小斯坦纳树森林

P3264 [JLOI2015]管道连接

每个关键点有其类型,要求同一类型的关键点连通即可。

可以考虑分别考虑每种类型,处理出使该类型的关键点全部连通的最小代价。令 ws 表示令集合 s 中的关键点全部连通的最小代价,其中 s 为显然有 1in,ws=min(f[i][s])

最后考虑合并代价。令 gs 表示使集合 s 中的关键点全部连通的最小代价,且 s 满足:若 s 包含某一类型的关键点,则该类型的所有关键点均在 s 中。有:ss,gs=min(gss+ws)

由于上面考虑了所有情况的最优解,因此不会重复选边。

最终答案为 g2k1

点权最小斯坦纳树

P4294 [WC2008]游览计划

要求 uVwu 最小。

状态照旧,考虑转移。

u 有多棵子树时,直接转移会重复累加 wu,所以方程为

ss,f[u][s]=min(f[u][ss]+f[u][s]wu)

u 有一棵子树时,有

(u,v)E,f[u][s]=min(f[v][s]+wu)

构造最小斯坦纳树

考虑直接记录更新当前状态的状态,然后递归处理。

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