【比赛】NOIP2017 宝藏
这道题考试的时候就骗了部分分。其实一眼看过去,n范围12,就知道是状压,但是不知道怎么状压,想了5分钟想不出来就枪毙了状压,与AC再见了。
现在写的是状压搜索,其实算是哈希搜索,感觉状压DP理解不了啊。思路来自于Gt,几乎照搬地写了自己的代码。
思路很简单,搜索。搜索里加了个启发,有点,不,是很像最优性剪枝。
dfs里,hsh是每个点的深度哈希起来(初始化要对于每一个点定一个专门的哈希值,用这个值来哈希自己的深度),k是已经连上了多少个点,val是代价。
估价函数里,对于每一个没有加入答案集合的点,找到他连上任意一个集合(可以是答案集合,也可以是以任意一个同样未连上答案集合的点为根的集合,这样的话当前点的深度就为2了)的最小代价。所有代价加起来后就是把剩下所有点加入答案集合的最低要求(不一定是这个值,但一定大于等于这个值),用这个优化dfs。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=,Mod=,inf=0x3f3f3f3f,base=;
int n,m,ans,hash[MAXN],f[Mod],G[MAXN][MAXN],d[MAXN];
inline void read(int &x)
{
int data=,w=;
char ch=;
while(ch!='-'&&(ch<''||ch>''))ch=getchar();
if(ch=='-')w=-,ch=getchar();
while(ch>=''&&ch<='')data=(data<<)+(data<<)+(ch^''),ch=getchar();
x=data*w;
}
inline void init()
{
for(register int i=;i<=n;++i)
for(register int j=;j<=n;++j)G[i][j]=inf;
hash[]=;
for(register int i=;i<=n;++i)hash[i]=(ll)hash[i-]*base%Mod;
for(register int i=;i<Mod;++i)f[i]=2e9;
ans=2e9;
}
inline int fr()
{
int res=;
for(register int i=;i<=n;++i)
if(!d[i])
{
int tmp=inf;
for(register int j=;j<=n;++j)
if(G[i][j]!=inf)
{
if(d[j])tmp=min(tmp,d[j]*G[i][j]);
else tmp=min(tmp,*G[i][j]);
}
res+=tmp;
}
return res;
}
inline void dfs(int k,int val,int hsh)
{
if(val+fr()>=ans||val>=f[hsh])return ;
f[hsh]=val;
if(k==n)
{
ans=min(ans,val);
return ;
}
for(register int i=;i<=n;++i)
if(!d[i])
for(register int j=;j<=n;++j)
if(d[j]&&G[i][j]!=inf)
{
d[i]=d[j]+;
dfs(k+,val+d[j]*G[i][j],(hsh+d[i]*hash[i])%Mod);
d[i]=;
}
}
int main()
{
freopen("treasure.in","r",stdin);
freopen("treasure.out","w",stdout);
read(n);read(m);
init();
for(register int i=;i<=m;++i)
{
int u,v,k;
read(u);read(v);read(k);
if(u==v)continue;
G[u][v]=min(G[u][v],k);
G[v][u]=min(G[v][u],k);
}
for(register int i=;i<=n;++i)
{
d[i]=;
dfs(,,hash[i]);
d[i]=;
}
printf("%d\n",ans);
return ;
}
NOIP2017 宝藏
【比赛】NOIP2017 宝藏的更多相关文章
- [NOIP2017]宝藏 状压DP
[NOIP2017]宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖 ...
- [NOIP2017]宝藏 子集DP
题面:[NOIP2017]宝藏 题面: 首先我们观察到,如果直接DP,因为每次转移的代价受上一个状态到底选了哪些边的影响,因此无法直接转移. 所以我们考虑分层DP,即每次强制现在加入的点的距离为k(可 ...
- NOIP2017宝藏 [搜索/状压dp]
NOIP2017 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘 ...
- NOIP2017 - 宝藏
LibreOJ链接 Description 给出一个\(n(n\leq12)\)个点\(m(m\leq1000)\)条边的带权无向图,求该图的一棵生成树,使得其边权×该边距根的深度之和最小. Solu ...
- Luogu 3959 [NOIP2017] 宝藏
NOIP2017最后一道题 挺难想的状压dp. 受到深度的条件限制,所以一般的状态设计带有后效性,这时候考虑把深度作为一维,这样子可以保证所有状态不重复计算一遍. 神仙预处理:先处理出一个点连到一个集 ...
- 洛谷P3959 [NOIP2017]宝藏
[题目描述] 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但 ...
- NOIP2017 宝藏 题解报告【状压dp】
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是 ...
- 【洛谷P3959】[NOIP2017] 宝藏
宝藏 题目链接 首先,打了一个prim,得了45分 #include<iostream> #include<cstring> #include<cstdio> #i ...
- [NOIP2017] 宝藏 【树形DP】【状压DP】
题目分析: 这个做法不是最优的,想找最优解请关闭这篇博客. 首先容易想到用$f[i][S][j]$表示点$i$为根,考虑$S$这些点,$i$的深度为$j$情况的答案. 转移如下: $f[i][S][j ...
随机推荐
- rest的Web服务端获取http请求头字段
如上图所示 输出的i就是获取的头字段的值 (仅自己记录)
- OpenGL(2)-窗口
写在前面 通过本节,你可以毫不费力的--->创建一个窗口 OpenGL中窗口,即载体 导入头文件 #include <glad/glad.h> #include <GLFW/g ...
- python-gevent模块(自动切换io的协程)
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import gevent def foo() ...
- Kubernetes探索学习001--Centos7.6使用kubeadm快速部署Kubernetes集群
Centos7.6使用kubeadm快速部署kubernetes集群 为什么要使用kubeadm来部署kubernetes?因为kubeadm是kubernetes原生的部署工具,简单快捷方便,便于新 ...
- 2017年10月WEB前端开发实习生面试题总结
从大一开始学习前端,今年大三,10月份开始投简历,陆续收到很多家公司的面试,目前为止的面试通过率是百分之百,总结下面试题. 不定期更新中... 百度第一次 一面 1.AJAX流程 2.promise简 ...
- Visual Studio AI配置环境
参考链接:http://www.cnblogs.com/ms-uap/p/9123033.html 背景: 1.能联网的电脑:Win7 64 SP1 2.鼠标.键盘.显示器好使 3.已安装VS2010 ...
- 20180711-统计PDB中的蛋白质种类、膜蛋白文件个数及信息等
20180710完成这份工作.简单,但是完成了还是很开心.在我尝试如何使用pickle保存数据后,尝试保存PDB文件中“HEADER”中的信息.文件均保存于实验室服务器(97.73.198.168)/ ...
- Scurm Meeting 11.2
成员 今日任务 明日计划 用时 徐越 写功能规格说明书,代码移植 创建数据库,代码移植 3h 赵庶宏 编写功能规格说明书,学习访问数据库代码,代码迁移 代码迁移 5h 武鑫 设计界面:独立完成一些简单 ...
- java微信开发之接受消息回复图片或者文本
上回说到 接口连接成功,接下来是真正的开发了. 消息的接收,整个过程就是关注订阅号的用户在微信订阅号中发送消息,微信服务器接收到消息,将消息发给开发者的服务器,服务器接收消息然后可以根据内容进行回复. ...
- 2017 Summary
几门课 基础电路与电子学 知道了一些二极管三极管的基本基本很基本的那种物理知识吧,但是毕竟我是从电信转专业过来的,所以说我内心就是逃避模电这样的课的.上课基本没听,后面只是死命复习了一周,考的还可以. ...