斯坦纳树入门小记
前言
普通的最小生成树,是用于求使给定点集连通的最小代价。
而斯坦纳树的不同点就在于,除了必选点之外,它还可以选择一些不必连通的辅助点,起到减小代价的作用。
大致思想
考虑最朴素的状压\(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\)即可。
例题
待到再迷茫时回头望,所有脚印会发出光芒