『宝藏 状态压缩DP NOIP2017』
<更新提示>
<第一次更新>
<正文>
宝藏(NOIP2017)
Description
参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度。
小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多。
小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。
在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以 任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路 所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏 屋之间的道路无需再开发。
新开发一条道路的代价是:
\]
L代表这条道路的长度,K代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的 宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。
请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代 价最小,并输出这个最小值。
Input Format
第一行两个用空格分离的正整数 n,m,代表宝藏屋的个数和道路数。
接下来 m 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏 屋的编号(编号为 1−n),和这条道路的长度 v。
Output Format
一个正整数,表示最小的总代价。
Sample Input
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1
Sample Output
4
解析
简单概括题意:给出一副无向图,每条边都有一个权值且均未开通,先可以随便取一个起点,要开通一些边,使它成为一个连通图,开通一条边的代价为这条边的权值*起点到它的点的个数(起点也算),求最小代价。
数据范围\(N<=12\),基本上可以确定是状压\(DP\)了。我们直接最简单地设置状态:\(f[S]\)代表以及取的节点的状态为S的最小代价,那么目标状态就是\(f[(1<<n)-1]\)。
如果考虑递推求解的话,我们发现需要计算花费的深度会很难枚举,这就导致了\(DP\)顺序的问题,如果选择用记忆化搜索求解的话,会方便很多。
由于起点不是确定的,我们需要用一重循环来枚举起点,然后以\(1<<(root-1)\)为初始状态,对每一种情况进行一次记忆化搜索,记搜的大体思路如下:
1.对于状态\(S\),枚举一个点\(i\),满足\(i \in S\)
2.在枚举一个点\(j\),满足\(i,j\)有边相连且\(j \notin S\)
3.状态转移方程:\(f[S']=min{f[S]+depth[i]*dis[i][j]}\)
4.更新新加入的节点j的深度
5.搜索下一个状态\(S'\)
6.回溯还原节点j的深度
最后在每一种情况的目标状态中取个\(min\)就是最终的答案了,时间复杂度\(O(n^32^n)\)。
\(Code:\)
#include<bits/stdc++.h>
using namespace std;
const int N=15,M=10015,Smax=(1<<N)+20,INF=0x3f3f3f3f;
int n,m,dis[N][N],f[Smax],depth[N],ans=INF;
inline void input(void)
{
memset(dis,0x3f,sizeof dis);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v,val;
scanf("%d%d%d",&u,&v,&val);
dis[u][v]=dis[v][u]=min(dis[u][v],val);
}
}
inline void Search(int S)
{
for(int i=1;i<=n;i++)
{
if((1<<(i-1))&S)
{
for(int j=1;j<=n;j++)
{
if(not ((1<<(j-1))&S)&&(dis[i][j]<INF))
{
if(f[S|(1<<(j-1))]>f[S]+depth[i]*dis[i][j])
{
int temp=depth[j];
depth[j]=depth[i]+1;
f[S|(1<<(j-1))]=f[S]+depth[i]*dis[i][j];
Search(S|(1<<(j-1)));
depth[j]=temp;
}
}
}
}
}
}
inline void solve(void)
{
for(int root=1;root<=n;root++)
{
memset(f,0x3f,sizeof f);
memset(depth,0x3f,sizeof depth);
f[1<<(root-1)]=0;
depth[root]=1;
Search(1<<(root-1));
ans=min(ans,f[(1<<n)-1]);
}
}
int main(void)
{
input();
solve();
printf("%d\n",ans);
}
<后记>
『宝藏 状态压缩DP NOIP2017』的更多相关文章
- 『最短Hamilton路径 状态压缩DP』
状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...
- 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
随机推荐
- Android进阶:七、Retrofit2.0原理解析之最简流程【下】
紧接上文Android进阶:七.Retrofit2.0原理解析之最简流程[上] 一.请求参数整理 我们定义的接口已经被实现,但是我们还是不知道我们注解的请求方式,参数类型等是如何发起网络请求的呢? 这 ...
- js常会问的问题:找出字符串中出现次数最多的字符。
一.循环obj let testStr = 'asdasddsfdsfadsfdghdadsdfdgdasd'; function getMax(str) { let obj = {}; for(le ...
- Big big world
Big big world I'm a big big girl 我是个大女孩 in a big big world 在这个大大的世界上 It's not a big big thing if you ...
- Oracle DBLINK的相关知识整理
一.DBLINK(Database Link)概念 dblink,顾名思义就是数据库的链接.当我们要跨本地数据库访问另一个数据库中的表的数据时,在本地数据库中就必须要创建远程数据库的dblink,通过 ...
- 转 c#性能优化秘密
原文:http://www.dotnetperls.com/optimization Generally, using the simplest features of the language pr ...
- node01
---恢复内容开始--- 1.node初体验 安装完成node,写好相应的js代码后,在cmd中node 文件名即可完成编译执行过程. 2.尝试使用node搭建一个简单服务器 //引入http模块 c ...
- pycahrm 安装Vue项目
首先在pycharm > preference > plugins > vue > 点绿色install 创建一个文件夹 然后cmd里cd到这个文件夹 npm install ...
- Hadoop集群搭建-HA高可用(手动切换模式)(四)
步骤和集群规划 1)保存完全分布式模式配置 2)在full配置的基础上修改为高可用HA 3)第一次启动HA 4)常规启动HA 5)运行wordcount 集群规划: centos虚拟机:node-00 ...
- layui layer弹框中表格的显示
场景描述:点击iframe里面的一个按钮,需要在父级弹出一个弹框表格. 问题描述:这个弹框的分页不能正常显示,如果把layer.open前面的parent去掉,就可以正常显示. 代码展示: paren ...
- [tkinter]隐藏/销毁控件
pack布局的情况下有pack_forget()方法让控件“不再显示”但控件还存在可以再次pack出来 from tkinter import * root = Tk() l1 = Label(roo ...