斯坦纳树入门小记

前言

普通的最小生成树,是用于求使给定点集连通的最小代价。

而斯坦纳树的不同点就在于,除了必选点之外,它还可以选择一些不必连通的辅助点,起到减小代价的作用。

大致思想

考虑最朴素的状压(DP),设(f_S)表示连通点集(S)的最小代价。

但是,斯坦纳树的题目一般都是必选点数量很小,辅助点数量却可能很多。

因此我们不得不改变状态的设立方式:(f_{i,S})表示以(i)为根、连通必选点点集(S)的最小代价。

说是以(i)为根,实际上这个根并没有什么具体意义,只是单纯方便转移而已。

然后转移就用两种方式:

  • 根据点转移:枚举(S)的一个子集(T),得到(f_{i,S}=f_{i,T}+f_{i,S xor T}-a_i)。即把凭借(a_i)连通的两个连通块合并起来,减去(a_i)是因为它在两个连通块中都有贡献,计算重复了。
  • 根据边转移:枚举一条边((u,v)),得到(f_{v,S}=f_{u,S}+a_v)。不难发现这就相当于是一个最短路的式子,直接(SPFA)即可。

例题

板子题:【BZOJ2595】[WC2008] 游览计划

原文地址:https://www.cnblogs.com/chenxiaoran666/p/SteinerTree.html