<更新提示>

<第一次更新>


<正文>

宝藏(NOIP2017)

Description

参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度。

小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多。

小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。

在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以 任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路 所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏 屋之间的道路无需再开发。

新开发一条道路的代价是:

\[L×K
\]

L代表这条道路的长度,K代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的 宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。

请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代 价最小,并输出这个最小值。

Input Format

第一行两个用空格分离的正整数 n,m,代表宝藏屋的个数和道路数。

接下来 m 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏 屋的编号(编号为 1−n),和这条道路的长度 v。

Output Format

一个正整数,表示最小的总代价。

Sample Input

  1. 4 5
  2. 1 2 1
  3. 1 3 3
  4. 1 4 1
  5. 2 3 4
  6. 3 4 1

Sample Output

  1. 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:\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=15,M=10015,Smax=(1<<N)+20,INF=0x3f3f3f3f;
  4. int n,m,dis[N][N],f[Smax],depth[N],ans=INF;
  5. inline void input(void)
  6. {
  7. memset(dis,0x3f,sizeof dis);
  8. scanf("%d%d",&n,&m);
  9. for(int i=1;i<=m;i++)
  10. {
  11. int u,v,val;
  12. scanf("%d%d%d",&u,&v,&val);
  13. dis[u][v]=dis[v][u]=min(dis[u][v],val);
  14. }
  15. }
  16. inline void Search(int S)
  17. {
  18. for(int i=1;i<=n;i++)
  19. {
  20. if((1<<(i-1))&S)
  21. {
  22. for(int j=1;j<=n;j++)
  23. {
  24. if(not ((1<<(j-1))&S)&&(dis[i][j]<INF))
  25. {
  26. if(f[S|(1<<(j-1))]>f[S]+depth[i]*dis[i][j])
  27. {
  28. int temp=depth[j];
  29. depth[j]=depth[i]+1;
  30. f[S|(1<<(j-1))]=f[S]+depth[i]*dis[i][j];
  31. Search(S|(1<<(j-1)));
  32. depth[j]=temp;
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. inline void solve(void)
  40. {
  41. for(int root=1;root<=n;root++)
  42. {
  43. memset(f,0x3f,sizeof f);
  44. memset(depth,0x3f,sizeof depth);
  45. f[1<<(root-1)]=0;
  46. depth[root]=1;
  47. Search(1<<(root-1));
  48. ans=min(ans,f[(1<<n)-1]);
  49. }
  50. }
  51. int main(void)
  52. {
  53. input();
  54. solve();
  55. printf("%d\n",ans);
  56. }

<后记>

『宝藏 状态压缩DP NOIP2017』的更多相关文章

  1. 『最短Hamilton路径 状态压缩DP』

    状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...

  2. 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...

  3. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  4. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  5. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  6. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  7. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  8. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

  9. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

随机推荐

  1. 2018-2019-2 20165235 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165235 <网络对抗技术> Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应 ...

  2. C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装

    修改自网路 CommonTools.h /* * CommonTools.h * * Created on: 2018年8月2日 * Author: didi */ #include <iost ...

  3. PBRT笔记(8)——材质

    BSDF类 表面着色器会绑定场景中每一个图元(被赋予了这个着色器),而表面着色器则由Material类的实例来表示.它会拥有一个BSDF类对象(可能是BSSDF),用于计算表面上每一点的辐射度(颜色) ...

  4. BZOJ.5305.[HAOI2018]苹果树(组合 计数)

    LOJ BZOJ 洛谷 BZOJ上除了0ms的Rank1啦.明明这题常数很好优化的. 首先,\(n=1\)时有\(2\)个位置放叶子,\(n=2\)时有\(3\)个... 可知\(n\)个点的有标号二 ...

  5. 关于resharper激活

    resharper 是一款非常强大的vs辅助开发插件,提供了很多快捷操作功能,本人已经离不开它了,但是resharper总会遇到lincese过期,需要激活的问题,现在提供以下方式,仅供参考 1.打开 ...

  6. KMP性质小结

    跪拜_Blackjack_神犇

  7. VS之设置文件编码格式

    VS2012默认格式为 "GB2312-80",很多时候可能出现乱码情况,就是编码问题,如何在VS里修改呢? 文件->“高级保存选项 ”  选择gb2312

  8. nmon监控分析

    一.下载软件安装 wget http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz tar xf nmon_linux_14i ...

  9. Spark入门PPT分享

    本篇PPT是我在公司内部进行Spark入门的分享,内容包含了Spark基本概念.原理.Streaming.SparkSQL等内容,现在分享出来. 下载请点击这里

  10. SDL 开发实战(二):SDL 2.0 核心 API 解析

    在上一篇文章 SDL 开发实战(一):SDL介绍及开发环境配置 中,我们配置好了SDL的开发环境,并成功运行了SDL的Hello World 代码.但是可能大部分人还是读不太明白具体Hello Wol ...