洛谷P3959

其实就是一道暴力搜索题……只是需要一个状态压缩的剪枝比较难想而已

这根本不叫dfs!只是一个递归而已……开始就被dfs坑了

思路:

首先一个基本的预处理

数据范围n≤12,m≤5000,说明肯定有很多没用的边,在读入的时候预处理掉就可以了,另外n很小可以用邻接矩阵存图访问快

解法一:暴力搜索

直接暴力搜索,开一个数组记录一个点有没有被访问过。每到一个状态,从访问过的点到未访问过的点引边算代价,递归枚举一下即可。但此方法时间复杂度较大,大约为O(n^n)?(没有仔细算),n<=8差不多能过

期望得分:70分(然而实际得分只有60分)

解法二:状态压缩剪枝

解法一很显然有很多无用的操作,那么如何进行剪枝呢?

答案是:状态压缩(这也是博主第一次接触到这个)

状态压缩就是用一个01串表示一个状态

每一位0代表未选择,1代表被选择

实际操作中我们通常用二进制数来表示状态压缩,为了方便我们用倒序(最右边是第一个,紧挨着是第二个,以此类推)

比如01串010001就可以表示第1个、第5个元素被选择了

然后使用位运算加速

选择某个元素(加入状态):x=x|(1<<(i-1))

判断第i个元素有没有选择:x&(1<<(i-1))(真:被选择;假:未选择)

那么,开一个数组f[i]表示当前根节点下状态为i的已搜索到的最小代价

这样我们在搜索时,如果这一次更新的代价比当前状态下以搜索到的最小代价要大(更新的代价>f[i]),说明这次搜索一定不是最优解,就不用进行递归算到最后

剪枝到底能减掉多少我不知道……但这一题可以AC了

期望得分:100分

AC代码:

 #include<cstdio>
#include<climits>
#include<cstring>
using namespace std;
int f[];//状态压缩答案存储
int tu[][];//邻接矩阵存图
int n,m;//点、边数
int depth[];//每个点深度
void find(int x)
{
for(int i=;i<=n;i++)
if(x&(<<(i-)))//编号为i的点访问过,从它开始更新
for(int j=;j<=n;j++)
if((!(x&(<<(j-))))&&tu[i][j]!=INT_MAX)//编号为j的点未访问过且i,j间有边相连
if(f[x]+depth[i]*tu[i][j]<f[x|(<<(j-))])//连i,j后答案比之前找出答案小则继续寻找,否则一定不是最优解,不用递归
{
f[x|(<<(j-))]=f[x]+depth[i]*tu[i][j];
depth[j]=depth[i]+;
find(x|(<<(j-)));
}
}
int min(int a,int b){return a<b?a:b;}
int main()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
tu[i][j]=INT_MAX;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
tu[u][v]=tu[v][u]=min(tu[u][v],w);//存最小边
}
int ans=INT_MAX;//保存答案
for(int i=;i<=n;i++)//对每个点暴力枚举
{
for(int j=;j<=(<<n)-;j++)
f[j]=INT_MAX;//每一个根节点都要初始化f[]
f[<<(i-)]=;
depth[i]=;//根节点深度为1
find(<<(i-));
ans=min(ans,f[(<<n)-]);
}
printf("%d\n",ans);
return ;
}

NOIP2017 D2T2 宝藏的更多相关文章

  1. NOIP2017 D2T2宝藏

    考场上写的prim一遍过了大样例也没想什么别的,反例也没举出来. 后来才知道由于要乘上深度所以无法贪心. 正解是状压但我不会,考后一个爆搜碾过去了. 心凉. #include<bits/stdc ...

  2. #333. 【NOIP2017】宝藏

    #333. [NOIP2017]宝藏 http://uoj.ac/problem/333 1.错误的$n^42^n$做法: dp[s]表示当前的点集为s,然后从这些点中选一个做起点i,然后枚举边,然后 ...

  3. 【NOIP2017】宝藏(状态压缩,动态规划)

    [NOIP2017]宝藏(状态压缩,动态规划) 题面 洛谷 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路 ...

  4. 「NOIP2017」宝藏

    「NOIP2017」宝藏 题解 博客阅读效果更佳 又到了一年一度NOIPCSP-S 赛前复习做真题的时间 于是就遇上了这道题 首先观察数据范围 \(1 \le n \le 12\) ,那么极大可能性是 ...

  5. [NOIP2017 TG D2T2]宝藏(模拟退火)

    题目大意:$NOIPD2T2$宝藏 题解:正常做法:状压DP .这次模拟退火,随机一个排列,$O(n^2)$贪心按排列的顺序加入生成树 卡点:没开$long\;long$,接受较劣解时判断打错,没判$ ...

  6. [NOIP2017 TG D2T2]宝藏

    题目大意:给定一个有重边,边有权值的无向图.从某一个点出发,求到达所有的点需要的最少费用,并且限制两点之间只有一条路径.费用的计算公式为:所有边的费用之和.而边$x->y$的费用就为:$y$到初 ...

  7. 【NOIP2017】宝藏

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的 \(m\) 条道路和它们的长度. 小明决心亲自前往挖掘 ...

  8. 【NOIP2017】宝藏 题解(状压DP)

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...

  9. 【NOIP2017】 宝藏 状压dp

    为啥我去年这么菜啊..... 我现在想了$20min$后打了$10min$就过了$qwq$. 我们用$f[i][j]$表示当前深度为$i$,访问了状态$j$中的所有点的最小代价. 显然$f[i][j] ...

随机推荐

  1. day67—angularJS学习笔记控制器

    转行学开发,代码100天——2018-05-22 angularJS通过控制器来控制数据流的应用. ng-controller. 控制器中包含属性和函数,其参数引用通过 $scope来执行. 如下文的 ...

  2. Unity ZTest 深度测试 & ZWrite 深度写入

    初学Shader,一开始对于渲染队列,ZTest 和 ZWrite一头雾水,经过多方查阅和实验,有了一些自己的理解.发此文与初学Shader的朋友分享,也算是为自己做个笔记.不对或不足之处欢迎指正. ...

  3. 自动爬取代理IP例子

    import time import json import datetime import threading import requests from lxml import etree from ...

  4. VirtualBox主机虚拟机互通

    首先使用的是桥接模式,桥接模式相当于是使用Hub来把主机以及虚拟机进行关联: 然后就是选择“界面名称”,这里吐槽一下,这里其实是“Interface Name”,Interface代表的是网卡的接口, ...

  5. Scala的集合框架

    1.元组 定义方式:val tp=("nana',1,1.1) 特点:集合中的数据可以是不同类型的 最多只能放22个元素 取值:通过角标取值,这里的角标是从1开始的,元组名称._角标   t ...

  6. HTML——超级链接 表格 框架

  7. sklearn+nltk ——情感分析(积极、消极)

    转载:https://www.iteye.com/blog/dengkane-2406703 步骤: 1 有标签的数据.数据:好评文本:pos_text.txt  差评文本:neg_text.txt ...

  8. 2.proxychains----Macchanger----anonsurf

    nano /etc/proxychains.conf 激活dynamic_chain 同是启用proxy_dns 只启用IP会泄露DNS位置信息,别人就知道你在用匿名 ipconfig    ifco ...

  9. 20191127 Spring Boot官方文档学习(4.12)

    4.12.缓存(Caching) Spring框架提供了对应用程序透明添加缓存的支持.从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数.缓存逻辑是透明应用的,不会对调用者造成任何 ...

  10. ELK7.4.0分析nginx json日志

    ELK7.4.0单节点部署 环境准备 安装系统,数据盘设置为/srv 内核优化参考 我们需要创建elk专用的账号,并创建所需要的目录并授权 useradd elk; mkdir /srv/{app,d ...