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 ...
随机推荐
- windows下的上帝模式,很好用,细想,很恐怖啊
原文地址:https://blog.csdn.net/qq_43371556/article/details/101210501 上帝模式,即"God Mode”,或称为“完全控制面板”.是 ...
- js中的那些遍历
说到遍历,首先想到的是数组的遍历,方法不要太多,比如 for, forEach,map,filter,every,some等 下面来看下,用法 首先 定义一个数组: 1. for循环,需要知道数组的长 ...
- kubernetes(K8S)创建自签TLS证书
TLS证书用于进行通信使用,组件需要证书关系如下: 组件 需要使用的证书 etcd ca.pem server.pem server-key.pem flannel ca.pem server.pem ...
- python操作toml文件
# -*- coding: utf-8 -*- # @Time : 2019-11-18 09:31 # @Author : cxa # @File : toml_demo.py # @Softwar ...
- 【转】反编译微信小程序错误: $gwx is not defined和__vd_version_info__ is not defined 已解决
修改wxappUnpacker文件中的 wuWxss.js function runVM(name, code) { // let wxAppCode = {}, handle = {cssFile: ...
- IntelliJ Idea设置默认换行符 Idea
http://hbyepei.github.io/2016/03/13/设置默认换行符/
- 网络分裂 redis 集群
REDIS cluster-tutorial -- Redis中文资料站 -- Redis中国用户组(CRUG) http://www.redis.cn/topics/cluster-tutorial ...
- 007 搜索API
1.说明 这个API用于在elasticsearch中搜索内容,用户可以通过发送以查询字符串为参数的get请求进行搜索,也可以在post请求的消息体中进行查询. 2.多索引 允许搜索所有的索引或某些特 ...
- flutter 不规则底部工具栏实现
import 'package:flutter/material.dart'; import 'each_view.dart'; class BottomAppBarDemo extends Stat ...
- linux(centos7.0以上版本)安装 mysql-5.7.24-linux-glibc2.12-x86_64.tar 版本的mysql
1:查看 linux下是否有老版本的mysql(有删除) 查找old mysql:rpm -qa | grep mysql 卸载:卸载命令:rpm –ev {包名}——:rpm -ev mysql ...