问题描述
斯坦纳树问题是组合优化学科中的一个问题。将指定点集合中的所有点连通,且边权总和最小的生成树称为最小斯坦纳树(Minimal Steiner Tree),其实最小生成树是最小斯坦纳树的一种特殊情况。而斯坦纳树可以理解为使得指定集合中的点连通的树,但不一定最小。(by Angel_Kitty)
解决方案
似乎没有多项式算法。在数据范围允许时可使用dp来解。具体地,设\(F[i,s]\)为根在点\(i\),树中包含的指定集合点的集合为\(s\)时的最优解。两种转移
\[ f[i,s]=\min_{t\subset s} f[i,t]+f[i',s-t]+e[i',i]\\ f[i,s]=\min f[i',s]+e[i',i] \]
显然第二种转移需要迭代/最短路算法。由于存在第二种转移,假设转移时能保证\(f[*,t]\)已经被处理好,第一种转移转移可以进一步简化为
\[ f[i,s]=\min_{t\subset s} f[i,t]+f[i,s-t] \]
这样做就大功告成了。
练习题
bzoj2595 [WC2008]游览计划
最小化点权和,大致相同,设\(F[i,j,s]\)为根在点\((i,j)\),指定集合状态为\(s\)的最小点权和,转移有
\[ f[i,j,s]=\min f[i',j',s]+c[i,j]\\ f[i,j,s]=\min_{t\subset s} f[i,j,t]+f[i',j's-t]=\min