斯坦纳树
最小斯坦纳树在带权无向图中连接给定的必选点,可以借助其他点降低总边权。必选点较少时,固定一个必选点作为最终的根,用状态压缩动态规划维护其余必选点的子集。转移在同一顶点合并两个子集,再沿最短路移动根。P6192 用 Floyd 预处理全源最短路,并用三角不等式保证移根转移可以原地更新。
参考资料
简介
给定边权非负的无向连通图 和必选点集 ,求包含 的边权和最小的连通子图。删去环上的边不会增大边权和,因此可以取一棵树,称为 最小斯坦纳树(Minimum Steiner Tree)。
树中可以包含 之外的点。例如,三个必选点两两之间的边权均为 ,另有一个点到三者的边权均为 。只用必选点的最小代价为 ,加入这个点后只需 。当 时,问题退化为 最小生成树;当 只有两个点时,答案就是两点间的 最短路 长度。
状态压缩动态规划
任选一个必选点 ,记其余必选点的集合为 。设 为连接子集 和顶点 的最小代价,答案为 。空集的代价为 。
记 为在同一个点 合并两个非空子集的最小代价:
若 只有一个点,则在该点令 ,其他位置为 。记 为 到 的最短路长度。合并后沿最短路移根:
对多点集合,取一棵所有叶子都属于 或为 的最优树。从 沿唯一的分支走到首个属于 的点或分叉点 ,也可能一开始就有 。若 ,将 单独分为一组;否则将 的分支分为两组。两组子树与 到 的路径互不重边,所以转移能覆盖最优解。反过来,两棵子树与最短路的并集连通且包含 和 ,实际代价至多为转移式中的和。
用 Floyd 预处理 ,再按掩码递增顺序处理子集。枚举划分时固定最低位所在的一侧。移根可原地更新:由三角不等式,经多个点移根不会优于直接移根。设 为点数、 为必选点数,读入后的时间复杂度为 ,空间复杂度为 。若图较稀疏,也可将 作为各点的初始距离,用多源 Dijkstra 完成移根。