[LUOGU] 3959 宝藏
https://www.luogu.org/problemnew/show/P3959
注意到n非常小,考虑状压/搜索。
发现状压需要枚举起点,跑n次,一个问题是转移不可以以数字大小为阶段了,考虑用dfs的方式递推。
一开始的naive想法是,跑2^n次Floyd,处理出每种联通情况下到根的最少经过点数,然后由N-1状态开始倒着记忆化搜索,出了很多锅,细节也不少。
考虑正着做,即刷表,发现很好写!也不必跑Floyd了,用dis数组一边跑一边更新最短距离就行。
f[S]表示联通情况为s时的最小代价,转移时枚举一个集合内的点,由它向外枚举一个点转移。
#include<iostream>
#include<cstdio> using namespace std; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=;
const int INF=<<; int n,m,N; int a[MAXN][MAXN];
int f[<<MAXN],dis[<<MAXN]; void dp(int s){
for(int i=;i<=n;i++){
if(!(s&(<<(i-)))) continue;
for(int j=;j<=n;j++){
if(s&(<<(j-))) continue;
if(a[i][j]==INF) continue;
if(f[s|(<<(j-))]>f[s]+(dis[i]+)*a[i][j]){
int sav=dis[j];
dis[j]=dis[i]+;
f[s|(<<(j-))]=f[s]+(dis[i]+)*a[i][j];
dp(s|(<<(j-)));
dis[j]--;
}
}
}
} int main(){
n=rd();m=rd();N=<<n;
int x,y,w;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
a[i][j]=INF;
for(int i=;i<=m;i++){
x=rd();y=rd();w=rd();
a[y][x]=a[x][y]=min(a[x][y],w);
}
int ans=INF;
for(int i=;i<=n;i++){
for(int j=;j<N;j++) f[j]=INF;
for(int j=;j<=n;j++) dis[j]=INF;
f[]=;f[<<(i-)]=;dis[i]=;
dp(<<(i-));
ans=min(ans,f[N-]);
}
cout<<ans;
return ;
}
[LUOGU] 3959 宝藏的更多相关文章
- [luogu]P3959 宝藏[NOIP][状态压缩DP]
		
[luogu]P3959 宝藏[TREASURE] 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的 ...
 - [Luogu P3959] 宝藏 (状压DP+枚举子集)
		
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
 - Solution -「Luogu 3959」 宝藏
		
果真是宝藏题目. 0x01 前置芝士 这道题我是真没往状压dp上去想.题目来源. 大概看了一下结构.盲猜直接模拟退火!\xyx 所需知识点:模拟退火,贪心. 0x02 分析 题目大意:给你一个图,可能 ...
 - Luogu 3959 [NOIP2017] 宝藏
		
NOIP2017最后一道题 挺难想的状压dp. 受到深度的条件限制,所以一般的状态设计带有后效性,这时候考虑把深度作为一维,这样子可以保证所有状态不重复计算一遍. 神仙预处理:先处理出一个点连到一个集 ...
 - Luogu 3959 [NOIP2017] 宝藏- 状压dp
		
题解 真的想不到这题状压的做法...听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ. 不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ ...
 - 【luogu P3959 宝藏】 题解
		
题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...
 - 洛谷 3959 宝藏——枚举+状压dp
		
题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ...
 - Luogu P3959 宝藏
		
这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分. 听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的 prim是一种基于贪心的算法,在本题中由于盲目的选择当前最 ...
 - 洛谷 3959 宝藏 NOIP2017提高组Day2 T2
		
[题解] 状压DP. f[i]表示现在的点是否连接的状态是i. #include<cstdio> #include<cstring> #include<algorithm ...
 
随机推荐
- NSString 是否存在空格
			
NSString *_string = [NSString stringWithFormat:@"123 456"]; NSRange _range = [_string rang ...
 - XHTML学习笔记 Part4:列表
			
1. 空格 如果在两个单词中间放置几个连续的空格,默认情况下只会显示一个空格,这种情况成为空格折叠.同样,如果在源文档中开始一个新行,或者放置多个连续的空行,则这些新行将被忽略并被处理为一个空格.对制 ...
 - (十二)SpringBoot 设置定时任务
			
一:创建定时任务 创建core→tesks→tesk.java package com.example.demo.core.tasks; import org.springframework.sche ...
 - (十四)SpringBoot开发微信授权支付
			
前提:配置好域名,在公众号配置 一.引用jar包,在pom.xml文件加入依赖 <dependency> <groupId>com.github.binarywang</ ...
 - IDEA快捷的添加包名
			
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题 2018年02月24日 17:24:49 _云卷云舒_ 阅读数:6264 标签: intellij idea 更 ...
 - TYVJ1424占卜DIY
			
Description lyd学会了使用扑克DIY占卜.方法如下:一副去掉大小王的扑克共52张,打乱后均分为13堆,编号1~13,每堆4张,其中第13堆称作“生命牌”,也就是说你有4条命.这里边,4张 ...
 - JavaScript 对象的原型扩展(JS面向对象中的继承)
			
<script type="text/javascript"> function person(name, age) { this._name = name; this ...
 - SpirngMVC-JSON
			
Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包,如下: 配置json转换器 在注解适配器中加入messa ...
 - 关于java中的不可变类(转)
			
如何在Java中写出Immutable的类? 要写出这样的类,需要遵循以下几个原则: 1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象. 2)Immuta ...
 - linux资源性能指标
			
1.cpu Running:正在运行的进程 Waiting:已准备就绪,等待运行的进程 Blocked:因为等待某些事件完成而阻塞的进程,通常在等待I/O 命令获取数据: vmstat 1其中: u ...