【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
洛谷P3959:https://www.luogu.org/problemnew/show/P3959
前言
NOIP2017时还很弱(现在也很弱
看出来是DP 但是并不会状压DP
现在看来思路并不复杂 只是存状态有点难想到
思路
因为n最大为12
所以可以想到是状压
因为n<=12 所以可以用邻接矩阵存下图
枚举每个点作为起点开始DFS
注意每次DFS的初始化和赋值问题即可
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 1e9+7
int n,m,ans=INF;
int f[],h[],dis[],map[][];//dis为题目中的k 即经过了几个宝藏
bool vis[][];
void dfs(int s)
{
for(int i=;i<=n;i++)
{
if(s&(<<(i-)))//寻找已经挖通的宝藏
for(int j=;j<=n;j++)//枚举下一个宝藏
{
if(!(s&(<<(j-)))&&vis[i][j]&&f[<<(j-)|s]>f[s]+dis[i]*map[i][j])
{//如果没有挖过j 且i与j之间有路径 且有一个更优解
int k=dis[j];//记录原dis方便后面回溯
dis[j]=dis[i]+;//记录新的dis
f[<<(j-)|s]=f[s]+dis[i]*map[i][j];//更新更优解
dfs(s|<<(j-));
dis[j]=k;//回溯
}
}
}
}
int main()
{
cin>>n>>m;
memset(map,INF,sizeof(map));//矩阵赋值最大值
for(int i=;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
if(z<map[x][y])//取最小的一条路
{
map[x][y]=z;
map[y][x]=z;
vis[x][y]=;//判断是否存在路径
vis[y][x]=;
}
}
for(int i=;i<=n;i++)//枚举每个点为起点
{
memset(dis,INF,sizeof(dis));//初始化
memset(f,INF,sizeof(f));
dis[i]=;//起点经过的点有1个
f[<<(i-)]=;//当前状态的最小值
dfs(<<(i-));//搜索
ans=min(ans,f[(<<n)-]);//状态满的时候取最小值
}
cout<<ans;
}
【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)的更多相关文章
- 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$
正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...
- 洛谷 P3959 NOIP2017 宝藏 —— 状压搜索
题目:https://www.luogu.org/problemnew/show/P3959 搜索: 不是记忆化,而是剪枝: 邻接矩阵存边即可,因为显然没有那么多边. 代码如下: #include&l ...
- 【洛谷4941】War2 状压Dp
简单的状压DP,和NOIP2017 Day2 找宝藏 代码几乎一样.(比那个稍微简单一点) f[i][j] ,i代表点的状态,j是当前选择的点,枚举上一个选到的点k 然后从f[i-(1<< ...
- 洛谷 P3112 后卫马克 —— 状压DP
题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...
- 洛谷 P1433 吃奶酪 状压DP
题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...
- 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)
传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...
- 洛谷P2473奖励关——状压DP
题目:https://www.luogu.org/problemnew/show/P2473 还是对DP套路不熟悉... 像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推: 看n只有15那 ...
- 【题解】P3959 宝藏 - 状压dp / dfs剪枝
P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝 ...
- 洛谷 P1879 玉米田(状压DP入门题)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int M,N; int plant[maxn][maxn];/ ...
随机推荐
- mysql,简单介绍一下索引
汉字很多,人力有时尽,人不可能记住所有的字,为了解决这个问题,于是有了字典.数据库里的数据很多,为了方便检索,于是有了索引. 索引,是一种数据结构,在这种数据结构中实现了高级的查找算法,索引可以帮助我 ...
- springboot aop使用介绍
第一步:添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- js-js和HTML的两种结合方式
第一种: - 使用一个标签 <script type="text/javascript"> js代码; </script> 第二种: - 使用script标 ...
- PowerDesigner设置所有int主键自增脚本
'*****************************************************************************dim model 'current mod ...
- class 命名规范
本文是从简书复制的, markdown语法可能有些出入, 想看"正版"和更多内容请关注 简书: 小贤笔记 注: 文章摘自 penggelies07- 简书, super晴天 - C ...
- 文字编辑器FCKeditor 简介以及基本配置和使用方法
什么是FCKeditor FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器.它志于轻量化,不需要太复杂的安装步骤即可使用.它可和PHP.JavaScript.ASP.ASP ...
- AndroidStudio安装教程
Android studio安装与配置 1.首先下载Android studio安装包,可以从http://www.android-studio.org/ 2.下载好该安装包之后,点击进行安装,依次出 ...
- Django后台注册
- GIT团队合作探讨之一-保持工作同步的概念和实践
感谢英文原文作者,这是我看到的关于git协同工作写的最清晰简洁的文章了: https://www.atlassian.com/git/tutorials/syncing/git-push SVN使用一 ...
- 从SuperSocket的App.config中读取配置,并修改保存,再重启服务
string XmlPath = System.Windows.Forms.Application.ExecutablePath + ".config"; XmlDocument ...