https://www.luogu.org/problemnew/show/P3959

注意到n非常小,考虑状压/搜索。

发现状压需要枚举起点,跑n次,一个问题是转移不可以以数字大小为阶段了,考虑用dfs的方式递推。

一开始的naive想法是,跑2^n次Floyd,处理出每种联通情况下到根的最少经过点数,然后由N-1状态开始倒着记忆化搜索,出了很多锅,细节也不少。

考虑正着做,即刷表,发现很好写!也不必跑Floyd了,用dis数组一边跑一边更新最短距离就行。

f[S]表示联通情况为s时的最小代价,转移时枚举一个集合内的点,由它向外枚举一个点转移。

#include<iostream>
#include<cstdio> using namespace std; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=;
const int INF=<<; int n,m,N; int a[MAXN][MAXN];
int f[<<MAXN],dis[<<MAXN]; void dp(int s){
for(int i=;i<=n;i++){
if(!(s&(<<(i-)))) continue;
for(int j=;j<=n;j++){
if(s&(<<(j-))) continue;
if(a[i][j]==INF) continue;
if(f[s|(<<(j-))]>f[s]+(dis[i]+)*a[i][j]){
int sav=dis[j];
dis[j]=dis[i]+;
f[s|(<<(j-))]=f[s]+(dis[i]+)*a[i][j];
dp(s|(<<(j-)));
dis[j]--;
}
}
}
} int main(){
n=rd();m=rd();N=<<n;
int x,y,w;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
a[i][j]=INF;
for(int i=;i<=m;i++){
x=rd();y=rd();w=rd();
a[y][x]=a[x][y]=min(a[x][y],w);
}
int ans=INF;
for(int i=;i<=n;i++){
for(int j=;j<N;j++) f[j]=INF;
for(int j=;j<=n;j++) dis[j]=INF;
f[]=;f[<<(i-)]=;dis[i]=;
dp(<<(i-));
ans=min(ans,f[N-]);
}
cout<<ans;
return ;
}

[LUOGU] 3959 宝藏的更多相关文章

  1. [luogu]P3959 宝藏[NOIP][状态压缩DP]

    [luogu]P3959 宝藏[TREASURE] 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的 ...

  2. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

  3. Solution -「Luogu 3959」 宝藏

    果真是宝藏题目. 0x01 前置芝士 这道题我是真没往状压dp上去想.题目来源. 大概看了一下结构.盲猜直接模拟退火!\xyx 所需知识点:模拟退火,贪心. 0x02 分析 题目大意:给你一个图,可能 ...

  4. Luogu 3959 [NOIP2017] 宝藏

    NOIP2017最后一道题 挺难想的状压dp. 受到深度的条件限制,所以一般的状态设计带有后效性,这时候考虑把深度作为一维,这样子可以保证所有状态不重复计算一遍. 神仙预处理:先处理出一个点连到一个集 ...

  5. Luogu 3959 [NOIP2017] 宝藏- 状压dp

    题解 真的想不到这题状压的做法...听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ. 不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ ...

  6. 【luogu P3959 宝藏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...

  7. 洛谷 3959 宝藏——枚举+状压dp

    题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ...

  8. Luogu P3959 宝藏

    这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分. 听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的 prim是一种基于贪心的算法,在本题中由于盲目的选择当前最 ...

  9. 洛谷 3959 宝藏 NOIP2017提高组Day2 T2

    [题解] 状压DP. f[i]表示现在的点是否连接的状态是i. #include<cstdio> #include<cstring> #include<algorithm ...

随机推荐

  1. pgsql_sql查询效率优化

    在pgsql中执行一个 5表 关联查询,效率比较差,问题定位 环境说明5张外表,其中with 中的临时表总记录数比较大,共有 2 亿条记录,通过时间序模型提高查询速度另外4张表 左表的记录非常小,最大 ...

  2. sql注入教学

    新手入坑sql注入,以下是笔记 首先本人存在这么一个mysql数据库 爆库 方法一: 先猜有几列 ,,, 数字依次增加,发现有四列,然后通过database()来爆表名 ,,  方法二: 通过构造一个 ...

  3. ZJOI2017 day2 T2 线段树 想法题

    考完D2发现自己简直zz了...花式扔基本分 首先这道题有个显然的套路:树上一些点到一个定点的距离和=这些点深度和+点数*定点深度和-2*lca深度和 ——上一次见这个套路是LNOI2014,上次做的 ...

  4. CentOS 部署RabbitMQ集群

    1. 准备两台CentOS,信息如下: node1:10.0.0.123 node2:10.0.0.124 修改hostname请参照: $ hostname # 查看当前的hostname $ ho ...

  5. JAVA常用知识总结(九)——线程

    sleep和wait的区别? sleep()来自Thread类,和wait()来自Object类.调用sleep()方法的过程中,线程不会释放对象锁.而 调用 wait 方法线程会释放对象锁 slee ...

  6. B. Hierarchy

    http://codeforces.com/problemset/problem/17/B 用邻接矩阵建图后, 设cost[v]表示去到顶点v的最小值. 很多个人去顶点v的话,就选最小的那个就OK 然 ...

  7. Java设计模式开篇

    在所有的设计模式开篇中,总是说一个好的架构,或多或少都会有设计模式的出现.当然或多或少也会使用设计模式的相关原则: SOLID+迪米尔原则 1.优化代码的第一步:单一职责原则 S:单一职责链原则:英文 ...

  8. Vue.js - day7

    使用mui的tab-top-webview-main完成分类滑动栏 兼容问题 和 App.vue 中的 router-link 身上的类名 mui-tab-item 存在兼容性问题,导致tab栏失效, ...

  9. Sass基本特性

    Sass扩展/继承@extend 代码的继承,声明方式:.class;调用方式:@extend 如: .btn { border: 1px solid #ccc; padding: 6px 10px; ...

  10. Json字符串转excel表格文件

    假如我们有一段json串,该json串是由一系列结构相同的数据集合组成,如下: { "data": [ { "groupId": "com.test. ...