Luogu3959 NOIP2017 宝藏 状压DP
题目传送门:https://www.luogu.org/problemnew/show/P3959
题意:给出一个有$N$个点的图,求其中的一个生成树(指定一个点为根),使得$\sum\limits_{i=1}^{N-1} v_i \times dep_i$最小,其中$v_i$为生成树上某条边的边权,$dep_i$为这条边连接的两个点中深度较浅的点的深度。$N \leq 12 , v \leq 5 \times 10^5$
$N \leq 12$给我们一个很强烈的信息:状态压缩
(所以这题还可以用暴力枚举+可持久化并查集拿90pts,用%你退火和诡异贪心拿到满分)
我们不妨考虑一层一层加入点
设$g_{i,j}$表示点集$j$向点集$i$每个点连一条边的最小权值和,可以在$O(3^NN^2)$的复杂度内算出(似乎可以优化成$O(3^NN)$)
然后设$f_{i,j}$表示现在的生成树中有$i$层节点,其中深度最深的节点集合为$j$时的最小权值,考虑转移为$f_{i+1,k}=f_{i,j}+g_{j,k}$
最后答案为$min\{f_{k,(1<<N)-1}\}$
复杂度为$O(3^NN^2)$,实际可优化成$O(3^NN)$
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define MAXN (1 << 12) + 1
using namespace std;
inline int read(){
;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return a;
}
inline int min(int a , int b){
return a < b ? a : b;
}
][MAXN] , route[][];
int main(){
memset(route , 0x3f , sizeof(route));
memset(g , 0x3f , sizeof(g));
int N = read() , M = read();
){
cout << ;
;
}
; i < N ; i++)
g[][ << i] = ;
while(M--){
int a = read() , b = read() , c = read();
route[a][b] = route[b][a] = min(route[a][b] , c);
}
; i < << N ; i++){
<< N) - ) ^ i;
& s){
int p = j;
for(int k = p & -p ; p ; k = p & -p){
int minN = 0x3f3f3f3f;
p -= k;
, q = i;
for(int m = q & -q ; q ; m = q & -q){
q -= m;
minN = min(minN , route[t][(]);
}
if(minN == 0x3f3f3f3f){
f[i][j] = 0x3f3f3f3f;
break;
}
f[i][j] += minN;
}
}
}
; i < N ; i++)
; j < << N ; j++){
if(j == (j & -j))
continue;
& j ; k ; k = k - & j)
][j ^ k] != 0x3f3f3f3f)
g[i][j] = min(g[i][j] , g[i - ][j ^ k] + f[j ^ k][k] * i);
}
int all = 0x7fffffff;
; i < N ; i++)
all = min(all , g[i][( << N) - ]);
cout << all;
;
}
Luogu3959 NOIP2017 宝藏 状压DP的更多相关文章
- [NOIP2017]宝藏 状压DP
[NOIP2017]宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖 ...
- 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$
正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...
- Luogu 3959 [NOIP2017] 宝藏- 状压dp
题解 真的想不到这题状压的做法...听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ. 不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ ...
- $[NOIp2017]$ 宝藏 状压$dp$
\(Sol\) 觉得这里是个很巧妙的地方吖,就是记下当前扩展点集的最大深度,然后强制下一步扩展的点集都是最大深度+1.这样做在当前看可能会导致误算答案导致答案偏大,但是整个\(dp\)完成后一定可以得 ...
- NOIp2017D2T2(luogu3959) 宝藏 (状压dp)
时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...
- P3959 宝藏 状压dp
之前写了一份此题关于模拟退火的方法,现在来补充一下状压dp的方法. 其实直接在dfs中状压比较好想,而且实现也很简单,但是网上有人说这种方法是错的...并不知道哪错了,但是就不写了,找了一个正解. 正 ...
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- 计蒜客 宝藏 (状压DP)
链接 : Here! 思路 : 状压DP. 开始想直接爆搜, T掉了, 然后就采用了状压DP的方法来做. 定义$f[S]$为集合$S$的最小代价, $dis[i]$则记录第$i$个点的"深度 ...
- loj2318 「NOIP2017」宝藏[状压DP]
附带其他做法参考:随机化(模拟退火.爬山等等等)配合搜索剪枝食用. 首先题意相当于在图上找一颗生成树并确定根,使得每个点与父亲的连边的权乘以各自深度的总和最小.即$\sum\limits_{i}dep ...
随机推荐
- 我的Java之旅 第六课 JAVA WEB 请求与响应
一.有关URL编码 1.在URL的规范中定义了一些保留字符,如:: / ? & = @ % 等,在URI中有它的作用.如果要在URI中包含这些字符,必须转码,即%字符后跟十六进 ...
- Apex单元测试
单元测试类 Salesforce中为Apex语言提供了完整的单元测试流程,包括单元测试类.测试的运行和结果分析等. 单元测试类是一种特殊的Apex类,基本语法和普通的Apex类一样. 单元测试类的结构 ...
- JavaScript大杂烩14 - 使用JQuery(上)
JQuery意义 - Why? 为什么要使用JQuery,从我个人来说,就是这么几点:简化代码 + 统一行为 + 功能强大 + 搭配方便. 简化代码是从写代码的角度来说的,实现同样的功能,如果用Jav ...
- 高德地图JS API 开发小结
项目中有一块功能要用到高德地图,所以,想把编码小结一下. 首先是地图的初始化 var map = new AMap.Map("mapDiv", { ...
- EasyUI报错 $(...).accordion is not a function
参考资料: https://stackoverflow.com/questions/9017634/accordion-is-not-a-function 原因:加载了2次jquery js文件
- php处理手机号中间的四位为星号****
在显示用户列表的场景中,一般用到手机号的显示时都需要对手机号进行处理,一般是把中间的四位换成星号****,我本人用php处理的思路是进行替换,用****替换手机号的中间四位 代码如下: $all_lo ...
- [SequenceFile_2] SequenceFile 的基本操作
0. 说明 测试序列文件的读写操作 && 测试序列文件的排序操作 && 测试序列文件的合并操作 && 测试序列文件的压缩方式 && 测试 ...
- vSphere ESXi 重新安装后的虚拟机恢复(转载)
安装的 ESXi 的物理主机密码忘记,登录 不上了,需要重新安装 ESXi,安装后恢复原先物理主机上的 虚拟机的方法如下(VMFS分区完好): 关于 VMFS 分区: ESXi 的安装时会划分一个分区 ...
- easyui的datebox控件如何只要年月不要日谢谢知道的说一下
例子2015-01 格式easyui-datebox 加上 data-options="formatter:myformatter,parser:myparser"function ...
- 解决Chunkize warning while installing gensim问题
问题: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warnings.warn("detected ...