思路主要是抄_rqy的,这神仙位运算tql,整理一下思路。

题目大意

给定\(n\)个点,\(m\)条有权边,从一个点\(s\)开始挖(任选),形成一个生成树(即已经挖通的两个点间不能连边),挖一条边的代价为边的长度乘\(s\)到边的终点的距离,求最小代价。

\(n \leq 12\)

思路

状压dp。

和一般的状压dp不一样,需要进行两层状压。

设\(f[S][d][i]\)为挖开点集\(S\),现在距离起点的距离为\(d\),所在的点为\(i\)的最小代价。

则\[f[S][d][i] = \min_{S_1\subset S}^{k\in S1} w(i, k)(d+1) + f[S1-\{k\}][d+1][k] + f[S-S1][d][i]\]

其中\(i \notin S, d+|S| \leq n\),因为当前至少已经挖开了\(d\)个点,最多只能挖开\(n-d\)个点。

初始化:\(f[0][d][i] = 0\)

注意\(S\)从小到大,\(d\)从大到小。

最终结果就是\[\min_{i=1}^nS[U-\{i\}][0][i]\]

复杂度

对于整个图,分成子集大小是\(1\)到\(n\)的考虑。
\[T(n) = \sum_{i=1}^n C_n^i 2^i = (2+1)^n = 3^n\]

(二项式定理,大小为\(i\)的集合有\(C_n^i\)个,它的子集有\(2^i\)个)

Code

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
#define File(IO_Filename) freopen(IO_Filename".in", "r", stdin), freopen(IO_Filename".out", "w", stdout)
typedef long long ll;
template<typename T> inline void in(T &x){char ch; x = 0;while(isspace(ch = getchar()));do x = x * 10 + ch - '0'; while(isdigit(ch = getchar()));
}
const int N = 13, INF = 0x3f3f3f3f;
int w[N][N], pc[1<<N], low[1<<N]; //pc表示集合的元素个数,low表示集合内最小的元素(用来取子集)
int f[1<<N][N][N];void wrbin(int x){if(x == 0) return ;wrbin(x >> 1);putchar('0' + (x & 1));
}int main(){// File("3959");int n, m, x, y, wt, tot;in(n); in(m);memset(w, 0x3f, sizeof(w)); memset(f, 0x3f, sizeof(f));for(int i=1; i<=m; i++){in(x); in(y); in(wt); --x; --y;w[x][y] = w[y][x] = min(w[x][y], wt);}tot = 1 << n;for(int i=0; i<tot; i++) pc[i] = pc[i & (i-1)] + 1;for(int i=0; (1 << i) < tot; i++) low[1 << i] = i;for(int i=0; i<tot; i++) low[i] = low[i & (-i)];for(int d=n-2; d>=0; d--)for(int i=0; i<n; ++i)f[0][d][i] = 0;for(int d=n-2; d>=0; --d)for(int i=0; i<n; ++i){for(int S=1; S<tot; ++S) if(pc[S] <= n - d && (S & (1 << i)) == 0) //优化for(int S1=S; S1; S1=(S1-1)&S){ //取S的子集S1for(int t=S1, k=low[t]; t; t&=(t-1), k=low[t]){ //取S1的所有元素if(w[i][k] != INF && f[S1-(1<<k)][d+1][k] != INF && f[S-S1][d][i] != INF)f[S][d][i] = min(f[S][d][i],w[i][k] * (d+1) + f[S1-(1 << k)][d+1][k] + f[S-S1][d][i]);}}}int ans = INF;for(int i=0; i<n; i++)ans = min(ans, f[tot-1-(1<<i)][0][i]);printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/RiverHamster/p/solution-p3959.html

LuoguP3959 宝藏 题解相关推荐

  1. 洛谷 P3959 [NOIP2017]宝藏 题解

    通向地底的传送门 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的$ m$ 条道路和它们的长度. 小明决 ...

  2. [NOIP2017 TG D2T2]宝藏(模拟退火)

    题目大意:$NOIPD2T2$宝藏 题解:正常做法:状压DP .这次模拟退火,随机一个排列,$O(n^2)$贪心按排列的顺序加入生成树 卡点:没开$long\;long$,接受较劣解时判断打错,没判$ ...

  3. AcWing-算法提高课【合集】

    算法提高 动态规划 数字三角形 1015. 摘花生 1018.最低通行费 1027. 方格取数 最长上升子序列LIS 1017. 怪盗基德的滑翔翼 1014.登山 482.合唱队形 1012. 友好城 ...

  4. 【luogu P3959 宝藏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...

  5. P2403 [SDOI2010]所驼门王的宝藏

    P2403 [SDOI2010]所驼门王的宝藏 题意: R * C的地图上有n个宝藏,给你n个宝藏的坐标,每个宝藏的位置上还有一个传送门,传送门有三种类型,1.可以传送到同行的其他宝藏位置,2.可以传 ...

  6. P3959 [NOIP2017 提高组] 宝藏

    P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说,就是n个点m个边,选定一个点为根节点,构造一个最小生成树,边的权值为该该边起点到根节点之间的点的数量K(不含根节点) * 道路长度 ...

  7. P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)

    文章目录 题目描述 解析 代码 洛谷传送门 题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个 ...

  8. NOIP模拟测试25「字符串·乌鸦喝水·所陀门王的宝藏(陀螺王)」

    字符串 题解 没看出catalan怎么办 dp打表啊! 考虑大力dp拿到30分好成绩!顺便收获一张表 打表发现$C_{n+m}^{m}-C_{n+m}^{m-1}$ 仔细观察然后发现其实就是之前的网格 ...

  9. 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

最新文章

  1. h3csnmp管理命令_H3C S5500V2-EI系列以太网交换机 命令参考-Release 1118-6W100_网络管理和监控命令参考_SNMP命令-新华三集团-H3C...
  2. ops中set_sysclk set_clkdiv set_pll详解
  3. qt中json构造一个数组_告别撸单元格!我来分享Excel中如何利用一条公式得到一个数组...
  4. Postman调用阿里云HTTPS动态注册接口(一型一密)
  5. 倍福 在 vs 里 编程 是怎么做到的_截图里的文字要改,字体怎么做到一模一样?...
  6. php预处理获取改变行数,php – 使用MySQLi预处理语句时无法获取行数...
  7. java 泛型集合示例_Java 泛型(示例代码)
  8. 最简洁的方式,实现web端百度地图一键定位导航
  9. VMware vCenter升级杂谈
  10. Matlab小波工具箱的使用2
  11. 音视频技术 数字电视发展应用
  12. (转)【JSON工具】一个JSON格式化查看工具——HIJSON
  13. 国际信息安全管理标准体系--BS7799
  14. Degree and Closeness Centrality
  15. BT3下载 与 BT3 U盘版制作
  16. pixi 小游戏_使用 Pixi.js 开发微信小游戏
  17. 解决IE浏览器打开,出现不能为“read”的问题
  18. 生命是脆弱的-人生最大的挫折
  19. 异步赠书:12月《Go Web编程》领航
  20. CTF学习-密码学解题思路

热门文章

  1. 力扣(LeetCode)打卡刷题交流计划(长期维护)
  2. 杭电1180java实现(bfs)
  3. 在Win7中使用Python的MySQLdb模块
  4. Java设计模式——装饰者模式
  5. 使用python写一个名片管理系统
  6. 内存分析工具MAT介绍
  7. XML简介及基本语法
  8. Gentoo 安装日记 06 (格式化和挂载系统)
  9. 数据结构 链表(一)
  10. java jndi 例子_MEJB附录B,jndi例子无法运行的问题