ACM学习笔记:斯坦纳树
title : 斯坦纳树 tags : ACM 图论 date : 2021-6-26
什么是斯坦纳树
给定 nn 个点 A1,A2,⋯,AnA1,A2,⋯,An,试求连接此 nn 个点,总长最短的直线段连接系统,并且任意两点都可由系统中的直线段组成的折线连接起来。他们将此新问题称为 斯坦纳树问题。
斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种。最小生成树是在给定的点集和边中寻求最短网络使所有点连通。而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络开销最小。
将指定点集合中的所有点连通,且边权总和最小的生成树称为最小斯坦纳树(Minimal Steiner Tree)
算法推导
这是一个组合优化问题,可以用状压DP来解决。
首先有已经结论:答案的子图一定是树。
我们首先钦定一个树根,设dp(i,S)表示以i为根,包含S点集的最小代价。
考虑状态转移:
$$
若i的度数等于1,则dp(j,s)+w(j,i)->dp(i,s)\\ 若i的度数大于1,则dp(i,T)+dp(i,S-T)->dp(i,S)(T\subseteq S)
$$
若i的度数等于1,则dp(j,s)+w(j,i)->dp(i,s)\\ 若i的度数大于1,则dp(i,T)+dp(i,S-T)->dp(i,S)(T\subseteq S)
$$
状态转移时对每个S,将图做松弛操作,采用dijkstra实现。
总的时间复杂度 O(n×3^k+mlog m ×2^k)

(洛谷P6192【模板】最小斯坦纳树 图示)
代码