当前位置: 首页 > news >正文

【比赛】NOIP2017 宝藏

 

这道题考试的时候就骗了部分分。其实一眼看过去,n范围12,就知道是状压,但是不知道怎么状压,想了5分钟想不出来就枪毙了状压,与AC再见了。

现在写的是状压搜索,其实算是哈希搜索,感觉状压DP理解不了啊。思路来自于Gt,几乎照搬地写了自己的代码。

思路很简单,搜索。搜索里加了个启发,有点,不,是很像最优性剪枝。

dfs里,hsh是每个点的深度哈希起来(初始化要对于每一个点定一个专门的哈希值,用这个值来哈希自己的深度),k是已经连上了多少个点,val是代价。

估价函数里,对于每一个没有加入答案集合的点,找到他连上任意一个集合(可以是答案集合,也可以是以任意一个同样未连上答案集合的点为根的集合,这样的话当前点的深度就为2了)的最小代价。所有代价加起来后就是把剩下所有点加入答案集合的最低要求(不一定是这个值,但一定大于等于这个值),用这个优化dfs。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int MAXN=20,Mod=19260817,inf=0x3f3f3f3f,base=10007;
 5 int n,m,ans,hash[MAXN],f[Mod],G[MAXN][MAXN],d[MAXN];
 6 inline void read(int &x)
 7 {
 8     int data=0,w=1;
 9     char ch=0;
10     while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
11     if(ch=='-')w=-1,ch=getchar();
12     while(ch>='0'&&ch<='9')data=(data<<3)+(data<<1)+(ch^'0'),ch=getchar();
13     x=data*w;
14 }
15 inline void init()
16 {
17     for(register int i=1;i<=n;++i)
18         for(register int j=1;j<=n;++j)G[i][j]=inf;
19     hash[0]=1;
20     for(register int i=1;i<=n;++i)hash[i]=(ll)hash[i-1]*base%Mod;
21     for(register int i=0;i<Mod;++i)f[i]=2e9;
22     ans=2e9;
23 }
24 inline int fr()
25 {
26     int res=0;
27     for(register int i=1;i<=n;++i)
28         if(!d[i])
29         {
30             int tmp=inf;
31             for(register int j=1;j<=n;++j)
32                 if(G[i][j]!=inf)
33                 {
34                     if(d[j])tmp=min(tmp,d[j]*G[i][j]);
35                     else tmp=min(tmp,2*G[i][j]);
36                 }
37             res+=tmp;
38         }
39     return res;
40 }
41 inline void dfs(int k,int val,int hsh)
42 {
43     if(val+fr()>=ans||val>=f[hsh])return ;
44     f[hsh]=val;
45     if(k==n)
46     {
47         ans=min(ans,val);
48         return ;
49     }
50     for(register int i=1;i<=n;++i)
51         if(!d[i])
52             for(register int j=1;j<=n;++j)
53                 if(d[j]&&G[i][j]!=inf)
54                 {
55                     d[i]=d[j]+1;
56                     dfs(k+1,val+d[j]*G[i][j],(hsh+d[i]*hash[i])%Mod);
57                     d[i]=0;
58                 }
59 }
60 int main()
61 {
62     freopen("treasure.in","r",stdin);
63     freopen("treasure.out","w",stdout);
64     read(n);read(m);
65     init();
66     for(register int i=1;i<=m;++i)
67     {
68         int u,v,k;
69         read(u);read(v);read(k);
70         if(u==v)continue;
71         G[u][v]=min(G[u][v],k);
72         G[v][u]=min(G[v][u],k);
73     }
74     for(register int i=1;i<=n;++i)
75     {
76         d[i]=1;
77         dfs(1,0,hash[i]);
78         d[i]=0;
79     }
80     printf("%d\n",ans);
81     return 0;
82 }
NOIP2017 宝藏

 

转载于:https://www.cnblogs.com/hongyj/p/8075877.html

相关文章:

  • gdb调试多线程程序总结
  • Excel2016通过宏生成拼音码
  • Web离线应用解决方案——ServiceWorker
  • am335x SPI spi_d0, spi_d1 out, in 模式设定
  • spring+activemq实战之配置监听多队列实现不同队列消息消费
  • cookie,localStorage和sessionStorage的区别
  • Centos7下配置Python3和Python2共存,以及对应版本Ipython安装配置
  • USB驱动程序之USB总线驱动程序学习笔记
  • django的部署以及和docker 的集成
  • SDN第四次作业
  • C. 字符类型及时间类型
  • 在兄弟连学Python Python项目计算器
  • 用PLSQL Developer 查看连接因子 tnsnames.ora
  • 个人作业——软件工程实践总结作业
  • 2008nian元旦
  • 【Amaple教程】5. 插件
  • 【comparator, comparable】小总结
  • Apache的基本使用
  • create-react-app做的留言板
  • CSS中外联样式表代表的含义
  • express + mock 让前后台并行开发
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Go 语言编译器的 //go: 详解
  • Golang-长连接-状态推送
  • javascript从右向左截取指定位数字符的3种方法
  • js数组之filter
  • React+TypeScript入门
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Terraform入门 - 1. 安装Terraform
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue2.0 实现互斥
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 安装python包到指定虚拟环境
  • 数据结构java版之冒泡排序及优化
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 大数据全解:定义、价值及挑战
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #Linux(make工具和makefile文件以及makefile语法)
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (C语言)共用体union的用法举例
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)UDP基本编程步骤
  • (译)计算距离、方位和更多经纬度之间的点
  • (转) ns2/nam与nam实现相关的文件
  • .net 中viewstate的原理和使用
  • .Net6 Api Swagger配置
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • /etc/fstab和/etc/mtab的区别
  • @SentinelResource详解
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [Android] Upload package to device fails #2720