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 ...
随机推荐
- shell文本处理工具
本文将介绍Linux下使用Shell处理文本时最常用的工具: find.grep.xargs.sort.uniq.tr.cut.paste.wc.sed.awk: 提供的例子和参数都是最常用和最为实用 ...
- 【Python 代码】生成hdf5文件
import random from PIL import Image import numpy as np import os import h5py from PIL import Image L ...
- 【caffe Blob】caffe中与Blob相关的代码注释、使用举例
首先,Blob使用的小例子(通过运行结果即可知道相关功能): #include <vector> #include <caffe/blob.hpp> #include < ...
- element-ui表格显示html格式
<el-table-column type="String" label="内容" prop="tpl" width="58 ...
- NumPyArray
import arcpy import numpy # Create a simple array from scratch using random values myArray = numpy.r ...
- R Shiny app | 交互式网页开发
网页开发,尤其是交互式动态网页的开发,是有一定门槛的,如果你有一定的R基础,又不想过深的接触PHP和MySQL,那R的shiny就是一个不错的选择. 现在R shiny配合R在统计分析上的优势,可以做 ...
- laravel 通过ftp上传的时候报错 Use of undefined constant FTP_BINARY - assumed 'FTP_BINARY
用Laravel中的filesystems里面的ftp上传文件时报错.在windows上开发,文件上传的时候碰到上面的问题,搜了些资料,发现是php7的ftp拓展默认未开启. filesystems是 ...
- FFmpeg: mac下手动编译android上使用的FFmpeg(支持x86、armeabi-v7a、arm64-v8a)
之前一直在linux下编译FFmpeg,最近换电脑了,尝试了下在mac下编译ffmpeg,特记录之. 一. 准备工作 1. 下载FFmpeg.(http://ffmpeg.org/download.h ...
- Python3基础 函数 多值参数 元组与字典形式(使用星号对列表与字典进行拆包)
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- 使用origin画SCI论文图
使用origin画SCI论文图 觉得有用的话,欢迎一起讨论相互学习~Follow Me start 使用的是OriginPro这款软件,这款软件的特点是 一个字 好 . 新建工作簿并导入数据 可以使用 ...