NOIP2017[提高组] 宝藏 题解





解析
我们观察范围可以发现n非常的小,(一般来说不是搜索就是状压dp)所以说对于这题我们可以用记忆化搜索或者dp,我们发现起点不同那么最终答案也就不同,也就是说答案是跟起点有关的,于是我们便可以想到去枚举每个起点,那么我们可以定义状态 $ f[i] $ 表示当前状态为 $ i $ 的时候最小花费,那么我们可以写出状态转移方程
$ f[x|(1<<(j-1))]=min(f[x]+dis[i]* d[i][j],f[x|(1<<(j-1))]) $
((1<<(j-1))&x)==0 && $ d[i][j]!=INF $)
其中x表示当前状态,当前状态中 $ j $ 号宝藏屋还没开发,并且 $ i->j $有路, $ dis[i] $ 表示 i 是第几个开发的。
代码
#include<bits/stdc++.h>
using namespace std;
const int INF=1<<30;
int n,m,u,v,z,ans=INF,d[25][25],dis[25],f[10100];
void find(int x){
for(int i=1;i<=n;i++){
if((1<<(i-1))&x){//在x这个状态中i已经开发了
for(int j=1;j<=n;j++){
if(((1<<(j-1))&x)==0&&d[i][j]!=INF){//j未开发且i可以到j
if(f[x|(1<<(j-1))]>f[x]+dis[i]*d[i][j]){
int tmp=dis[j];
dis[j]=dis[i]+1;
f[x|(1<<(j-1))]=f[x]+dis[i]*d[i][j];
find(x|(1<<(j-1)));
dis[j]=tmp;//回溯
}
}
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i){//初始化
for(int j=1;j<=n;++j){
d[i][j]=INF;
}
}
for(int i=1;i<=m;++i){//m<=1000所以会有重复路径
scanf("%d %d %d",&u,&v,&z);
d[u][v]=min(d[u][v],z);
d[v][u]=min(d[v][u],z);
}
for(int o=1;o<=n;++o){//枚举起点
for(int i=1;i<=n;++i) dis[i]=INF;
for(int i=1;i<=(1<<n)-1;++i) f[i]=INF;//初始化
dis[o]=1;//第一个
f[1<<(o-1)]=0;
find(1<<(o-1));
ans=min(ans,f[(1<<n)-1]);
}
printf("%d",ans);
return 0;
}
/*
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1
*/
NOIP2017[提高组] 宝藏 题解的更多相关文章
- 【题解】NOIP2017 提高组 简要题解
[题解]NOIP2017 提高组 简要题解 小凯的疑惑(数论) 不讲 时间复杂度 大力模拟 奶酪 并查集模板题 宝藏 最优解一定存在一种构造方法是按照深度一步步生成所有的联通性. 枚举一个根,随后设\ ...
- 题解 [NOIP2017 提高组]宝藏
传送门 这是蓝书上状压的例题啊,怎么会出现在模拟赛里 不过就算原题我也没把握写对 核心思路: 先令\(dp[s]\)为当前状态为\(s\)时的总花费最小值,\(cnt[s][i]\)为这个方案中由根节 ...
- NOIP2017提高组day2T1题解(奶酪)
题目链接:奶酪 这道题还是很水的,在下拿了满分. 并没有用什么高级的算法,我讲一下基本思路. 我们把每个洞都视为一个节点. 我们读入相关数据后,就先进行预处理,通过每个节点的信息和题目的规定,建立一张 ...
- [NOIp2017提高组]宝藏
#include<cstdio> #include<cctype> #include<algorithm> inline int getint() { regist ...
- [NOIP2017 提高组] 宝藏
考虑到这种对于某种操作顺序有一个权值. 且这个权值有一个\(O(n)\)或者更好的复杂度求出. 求最值. 那可以用模拟退火. #include<iostream> #include< ...
- [NOIp2017提高组]列队
[NOIp2017提高组]列队 题目大意 一个\(n\times m(n,m\le3\times10^5)\)的方阵,每个格子里的人都有一个编号.初始时第\(i\)行第\(j\)列的编号为\((i-1 ...
- JZOJ 5196. 【NOIP2017提高组模拟7.3】B
5196. [NOIP2017提高组模拟7.3]B Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5197. 【NOIP2017提高组模拟7.3】C
5197. [NOIP2017提高组模拟7.3]C Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5195. 【NOIP2017提高组模拟7.3】A
5195. [NOIP2017提高组模拟7.3]A Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
随机推荐
- win7“您可能没有权限使用网络资源”的解决办法
删除“拒绝从网络访问这台计算机”里面的Gu 1 在屏幕的左下角点开[开始]----在搜索程序和文件那个文本框里输入[输入gpedit.msc]然后回车. 2 弹出如下图的对话框, 3 依次展开-- ...
- CPU突然飙升到300%,Dubbo活动线程数直接飙到1000
转:https://mp.weixin.qq.com/s/-lSiVDfqYrKk_w-xitYBhA 背景:新功能开发测试完成后,准备发布上线,当发布完第三台机器时,监控显示其中一台机器CPU突然飙 ...
- python matplotlib生成图形
y=2x+3 import matplotlib.pyplot as plt#约定俗成的写法plt #首先定义两个函数(正弦&余弦) import numpy as np #plt.figur ...
- Tosca:键盘输入字符串
这是方法之一
- AWS Fargate
AWS Lambda都是浮云,AWS Fargate才是王道——无服务器的未来,有我没你! - DockOne.iohttp://www.dockone.io/article/4656 通过 Farg ...
- MySQL 5.6&5.7 性能优化 TOP10(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/NLOneDay/article/deta ...
- PHP使用MongoDB类操作MongoDB数据库总结
参考:https://www.php.net/manual/zh/class.mongodb-driver-manager.php 参考:https://www.zhaokeli.com/articl ...
- SSH SCP 远程密钥登录配置和服务器间的文件传输
目录 ssh ssh是什么 ssh安装 使用ssh登录远程主机 退出登录 使用ssh执行单条指令 密钥验证 详细操作 scp rsync sftp 进阶 ssh ssh是什么 ssh (Secure ...
- expandablelistView 可展开的列表
这个东西用法基本固定,不知道能不能做三级的展开. 界面代码 <?xml version="1.0" encoding="utf-8"?> <L ...
- typeScript中的函数
// 函数的定义 //es5定义函数的方法 /* //函数声明法 function run(){ return 'run'; } //匿名函数 var run2=function(){ return ...