Luogu 3959 [NOIP2017] 宝藏- 状压dp
题解
真的想不到这题状压的做法。。。听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ。
不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ 联通的最小代价, 也就是从 $i$ 到 $ j, j \in S$的最小距离。
接着处理$ss_{S, T}$, $S\subset T$, 表示从集合$S$拓展到$T$所需要的最小代价。
最后求出$f_{i, j}$ 表示当前已到 深度$i$, 已经扩展到集合$S$时耗费的最小代价. 答案就是$ \min(f_{i, U })$ $ i \in [0, n - 1]$
是可以求出所有的挖掘方案中的最小代价, 是个正确算法(吧,应该
代码
#include<cstring>
#include<algorithm>
#include<cstdio>
#define rd read()
#define rep(i,a,b) for( int i = (a); i <= (b); ++i )
#define per(i,a,b) for( int i = (a); i >= (b); --i )
using namespace std; const int N = ;
const int M = << ;
const int inf = ; int pt[N][M], ss[M][M], f[N][M], mp[N][N], n, m; inline int read() {
int X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar() ) if( c == '-' ) p = -;
for(; c >= '' && c <= ''; c = getchar() ) X = X * + c - '';
return X * p;
} inline void cmin( int &a, int b ) {
if( a > b ) a = b;
} int main()
{
n = rd; m = rd;
memset(pt, , sizeof(pt));
memset(f, , sizeof(f));
memset(mp, , sizeof(mp));
rep( i, , m ) {
int u = rd - , v = rd - , w = rd;//我从0开始存点
cmin( mp[u][v], w );
cmin( mp[v][u], w );
}
//求出点连到集合的最小代价
rep( S, , ( << n) - )
rep( i, , n - ) if((S >> i) & )
rep( j, , n - ) if(!((S >> j) & ))
cmin( pt[j][S], mp[j][i] );
//求出集合扩展的最小代价
rep( S, , ( << n) - )
for( int j = S & (S - ); j; j = S & (j - ) ) {//j为S 的子集,神奇的枚举子集方法
int left = S ^ j;
rep( i, , n - ) if((left >> i) & )
ss[j][S] = min( ss[j][S] + pt[i][j], inf );
} rep( i, , n - ) f[][ << i] = ;
rep( i, , n - )
rep( S, , ( << n) - )
for( int j = S & (S - ); j; j = S & (j - ) ) {
int tmp;
if( ss[j][S] != inf ) tmp = ss[j][S] * i;//集合能够扩展
else tmp = inf;
if( f[i - ][j] != inf ) cmin( f[i][S], f[i - ][j] + tmp );//上一步的状态可行
}
int ans = inf;
rep( i, , n - ) cmin( ans, f[i][ ( << n) - ] );//求出最小值
printf("%d\n", ans);
}
Luogu 3959 [NOIP2017] 宝藏- 状压dp的更多相关文章
- [NOIP2017]宝藏 状压DP
[NOIP2017]宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖 ...
- 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$
正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...
- Luogu3959 NOIP2017 宝藏 状压DP
题目传送门:https://www.luogu.org/problemnew/show/P3959 题意:给出一个有$N$个点的图,求其中的一个生成树(指定一个点为根),使得$\sum\limits_ ...
- $[NOIp2017]$ 宝藏 状压$dp$
\(Sol\) 觉得这里是个很巧妙的地方吖,就是记下当前扩展点集的最大深度,然后强制下一步扩展的点集都是最大深度+1.这样做在当前看可能会导致误算答案导致答案偏大,但是整个\(dp\)完成后一定可以得 ...
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- Luogu 3959 [NOIP2017] 宝藏
NOIP2017最后一道题 挺难想的状压dp. 受到深度的条件限制,所以一般的状态设计带有后效性,这时候考虑把深度作为一维,这样子可以保证所有状态不重复计算一遍. 神仙预处理:先处理出一个点连到一个集 ...
- P3959 宝藏 状压dp
之前写了一份此题关于模拟退火的方法,现在来补充一下状压dp的方法. 其实直接在dfs中状压比较好想,而且实现也很简单,但是网上有人说这种方法是错的...并不知道哪错了,但是就不写了,找了一个正解. 正 ...
- NOIp2017D2T2(luogu3959) 宝藏 (状压dp)
时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...
- 计蒜客 宝藏 (状压DP)
链接 : Here! 思路 : 状压DP. 开始想直接爆搜, T掉了, 然后就采用了状压DP的方法来做. 定义$f[S]$为集合$S$的最小代价, $dis[i]$则记录第$i$个点的"深度 ...
随机推荐
- 华为手机如何查看WiFi密码
2017.8.26 (补充) 博主更新华为手机系统之后,发现下面的教程已经不适用了,新系统在备份WLAN时强制要求设置密码,无法跳过,所以下面的教程仅适用于备份时可以跳过设置密码的系统. 有时候手机用 ...
- html大小写问题
js中变量名,函数,关键字都区分大小写,如var i;和var I;是两个不同的变量. css中定义的元素名称不区分大小写的. html中,标签和标签属性统一使用小写形式,固有属性也一律使用小写,自定 ...
- 在 mvc 4 中使用 unity 进行依赖注入
在 mvc 4 中使用 unity 进行依赖注入 关于依赖注入的概念,这里就不再叙述了,我们用 mvc 4 结合 unity,使用构造函数来进行依 赖注入.具体步骤如下: 1. 首先建立 一个 mvc ...
- video元素和audio元素
内容: 1.video元素 2.audio元素 注:这两个元素均是HTML5新增的元素 1.video元素 (1)用途 <video> 标签定义视频,比如电影片段或其他视频流 (2)标签属 ...
- python应用之爬虫实战1 爬虫基本原理
知识内容: 1.爬虫是什么 2.爬虫的基本流程 3.request和response 4.python爬虫工具 参考:http://www.cnblogs.com/linhaifeng/article ...
- linnux-shell知识
awk 是单行处理文本 正则: cat test.py | awk '/a/ {print $1}' # 如果test.py中存在a这个字母,就打印所在行的第一列(注意是该列,不是该词).匹配成功, ...
- selenium ie 模拟request pahonjs
- 今天练手了下mysqlbinlog,标记下
1 首先查看是否开启了 bin log 登录mysql后 使用命令 show variables like "log_%"; show binary logs; 2 确认开启了 ...
- Pycharm远程连接服务器(windows下远程修改服务器代码)
1.写在前面 之前一致用putty,ssh,修改代码,或者本地修改,上传到服务器,各种不爽,现在改用xshell,但是有时候还是不方便感觉,于是自己配置了远程连接pycharm,这样不用总是到 ...
- 9 个Java 异常处理的规则
在 Java 中,异常处理是个很麻烦的事情.初学者觉得它很难理解,甚至是经验丰富的开发者也要花费很长时间决定异常是要处理掉和抛出. 所以很多开发团队约定一些原则处理异常.如果你是一个团队的新成员,你可 ...