斯坦纳树 + 状压 .
- 开始感觉直接做一颗最小生成树出来,把没用的边割掉就好了.然而随手画几个图发现是错的.
然后学习了一波 最小斯坦纳树 .这东西可以看做是最小生成树的一般情况.生成树是求一个选边方案,将所有的点加入联通块中.斯坦纳树是把指定点集中的点加入联通块中,也可以加入不在点集中的点来辅助.
求解最小斯坦纳树是 $NP$ 的,没有多项式算法,用状压做.
设 $f[S][i]$ 为指定点的连通状态为 $S$ ,最小斯坦纳树的根节点为 $i$ 时的最小权值.转移有两种.
第一种是将当前集合拆成两个不相交的子集, $f[S][i]\leftarrow f[S_1][i]+f[S_2][i],S_1,S_2\subset S,S_1 \& S_2=0$ .
另一种是换根, $f[S][i]\leftarrow f[S][j]+val_{i,j}$ ,后者表示连接 $i,j$ 的边权.这东西有后效性,用 $Spfa$ 转移.而这道题是指定点对间连通,可以看做最小斯坦纳森林.设 $g[S]$ 表示连通了点集 $S$ 的最小斯坦纳森林的权值.
- 转移有 $g[S]\leftarrow g[S_1]+g[S_2],S_1,S_2\subset S,S_1 \& S_2=0$ .即将 $S$ 拆成两个不相交子集. $S_1,S_2$ 都需要满足每对对应点要么都不在其中,要么都在其中.
- 最后答案就是 $g[S_0]$ , $S_0$ 表示将那 $2d$ 个点都连通的状态.
小心爆 $int$ .
1 |
|