【学习笔记】最小斯坦纳树

比赛前的算法复习

最小斯坦纳树

洛谷模板题
最小斯坦纳树,指在一张带权无向图中,给定指定的k个点,询问联通这k个点的最小路径权值和。
这种问题所给出的k一般较小,所以可以用状压DP来解决。

显然结论:最终选出的边构成的图一定是棵树

由此,我们可以定义 $f(i,S) $ 为当前以 \(i\)为根,联通了集合 \(S\) 的点所需的最小权值和。
对于当前点 \(i\) ,有两种转移方式:

  • \(f(i,S)=min(f(i,S),f(j,S)+w(i,j))\)
    其中\(j\)为和\(i\)相邻的点,此转移相当于换根
  • \(f(i,S)=min(f(i,S),f(i,T)+f(i,S-T))\)
    其中 \(T\)\(S\) 的子集,此转移可看作以 \(i\) 为根时的子树状态合并。

\(S\) 所包含点是单增的,所以我们可以从小到大枚举。

考虑第一种转移,形式类似于最短路,直接跑最短路就行。
第二种转移枚举子集

子集枚举模板
点击查看代码
for(int k=s&(s-1);k<=(1<<n);k=s&(k-1)){
	...
}

例题:[WC2008]游览计划

posted @ 2022-09-16 11:57  flywatre  阅读(109)  评论(0)    收藏  举报