最小斯坦纳树笔记
P6192 【模板】最小斯坦纳树
思想:状压+最短路
题意:花费最小的代价,连通给定的 k 个关键点。
做法:两种操作
- 当前点为根包含关键点集合从当前子集转移过来
for(int p=i&(i-1);p;p=i&(p-1)) { dp[j][i]=min(dp[j][i],dp[j][p]+dp[j][i^p]); } - 从相邻点集合转移过来
dp[v][vall]=dp[u][vall]+e[i].val;
注意到是形如最短路的东西,先把1操作处理完扔进来跑最短路即可。
P3264 [JLOI2015] 管道连接
思想:最小斯坦纳树+状压
题意:花费最小的代价,每种颜色连通给定的 k 个相同颜色点。
做法:枚举选择的颜色子集,将关键点放一起进行最小斯坦纳树(这东西不需要一个一个处理,注意到它本身就是状压,直接一起处理最后分批拿开即可),然后再从其颜色集合的子集推过来进行取\(\min\),因为你进行了最小斯坦纳树,所以一旦有重合的是一定比最开始最小斯坦纳树劣的,所以一定不会取到。
AT_abc364_g [ABC364G] Last Major City
思想:最小斯坦纳树
题意:给出一个 n 个点 m 条边的边带权无向图和一个正整数 k,对于每个 k≤i≤n,回答将 1∼k−1 个点以及第 i 个点连通所需的最小代价。
做法:需要理解dp数组的含义————当前点为根包含关键点集合,把 1∼k−1 个点进行最小斯坦纳树,\(dp_{i,((1<<(k-1))-1)}\)就是答案。
AT_abc395_g [ABC395G] Minimum Steiner Tree 2
思想:最小斯坦纳树
题意:固定点集 S 然后每次询问等价于往里面多丢两个数。
做法:与上题雷同,直接枚举其中一个点,暴力重构,转化为上题。

浙公网安备 33010602011771号