【洛谷-3959】 宝藏

感觉NOIP2107提高组的题只写第一道水题不太合适?然后再写一道……线下考试的时候脑子瓦特了,状压都写了就是没写出正解QwQ

+传送门+


◇ 题目(copy from 洛谷)

题目描述

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

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

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

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

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

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

输入输出格式

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

输出格式:
一个正整数,表示最小的总代价。


◇ 解析

看到n的数据规模就大概知道是状压了(因为2^12=4096并不大,状压比较合适,也算是一个小技巧吧)。

根据贪心的思想,只要所有宝藏都连通就可以了,所以只需要生成一棵树!但是这棵生成树非常的奇妙……不仅是有根树,而且根的位置还会影响权值,这就是为什么不能直接生成树。那么状压就开始有用了?:dp[S] 表示当前生成树的点集为S时的最小花费。

因为最后生成树的根会对答案产生直接影响,所以我们需要先枚举点i作为根。那么生成树的初始状态就只包含 i 这一个根节点,也就是(1<<i),此时没有边,权值也就是0。然后根据样例我们容易发现一条边对于最后权值的贡献为 它的起点的深度×边的长度 (根节点深度为1),所以我们需要计算一下点的深度 dep[]。

话不多说,先把状态转移方程列出来,再解释也不迟?:

dp[S] = min{ dp[S|(1<<v)] + dep[u] * lnk[u][v] } (u属于S,v不属于S)

从原来的状态S拓展到(S+v),即从属于S的一个点u扩展到v,则增加的是起点u的深度dep[u]乘上u到v的距离。

接下来就很简单了——先枚举一个树的根,并把它的深度定为1。现在树只有一个节点,从这个状态开始转移:先枚举当前状态中的一个点u,再枚举一个不属于当前状态的点v,扩展,最后扩展到包含所有点。


◇ 解析

/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline bool insid(int a,int b) {return ((1<<a)&b);}
const int N=12;
int n,m,INF;
int lnk[N+7][N+7],dp[(1<<N)+7],dep[N+7];
void DFS(int S){for(int u=0;u<n;u++)if(insid(u,S))for(int v=0;v<n;v++)if(!insid(v,S) && lnk[u][v]<INF){int s=S|(1<<v);if(dp[s]>dp[S]+lnk[u][v]*dep[u]){dp[s]=dp[S]+lnk[u][v]*dep[u];int las=dep[v];dep[v]=dep[u]+1;DFS(s);dep[v]=las;}}
}
int main(){//freopen("treasure.in","r",stdin);//freopen("treasure.out","w",stdout);memset(lnk,0x3f,sizeof lnk);INF=lnk[0][0];scanf("%d%d",&n,&m);for(int i=0;i<m;i++){int u,v,l;scanf("%d%d%d",&u,&v,&l);u--;v--;lnk[u][v]=lnk[v][u]=min(lnk[u][v],l);}int ans=INF;for(int i=0;i<n;i++){memset(dep,0x3f,sizeof dep);memset(dp,0x3f,sizeof dp);dep[i]=1;dp[1<<i]=0;DFS(1<<i);ans=min(ans,dp[(1<<n)-1]);}printf("%d\n",ans);return 0;
}

  


The End

Thanks for reading!

- Lucky_Glass

(Tab:如果我有没讲清楚的地方可以直接在邮箱lucky_glass@foxmail.com email我,在周末我会尽量解答并完善博客~?)

转载于:https://www.cnblogs.com/LuckyGlass-blog/p/9650872.html

【杂题总结】洛谷-3959 宝藏相关推荐

  1. 洛谷 #3959. 宝藏

    题意 略 题解 dfs+贪心+剪枝 80pts random_shaffel 100pts 调试记录 f初值 %%% chenchen dfs #include <cstdio> #inc ...

  2. 题161.洛谷P3131 前缀和与差分-Subsequences Summing to Sevens S

    文章目录 题161.洛谷P3131 前缀和与差分-Subsequences Summing to Sevens S 一.题目 二.题解 题161.洛谷P3131 前缀和与差分-Subsequences ...

  3. 【暑期每日一题】洛谷(一)

    [暑期每日一题]洛谷 P1048 [NOIP2005 普及组] 采药 [暑期每日一题]洛谷 P1048 [NOIP2005 普及组] 采药_辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为 ...

  4. 【数学1】基础数学问题 - 题单 - 洛谷

    这里写目录标题 [[数学1]基础数学问题 - 题单 - 洛谷](https://www.luogu.com.cn/training/117) [P1143 进制转换](https://www.luog ...

  5. 【暑期每日一题】洛谷 P7583 [COCI2012-2013#1] DOM

    题目链接:P7583 [COCI2012-2013#1] DOM - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给定一个仅包含大写字母的单词,删除该单词中的以下九个字母: ...

  6. 刷题记录:洛谷P4147玉蟾宫

    传送门:洛谷 题目描述: 这片土地被分成 N × M N\times M N×M 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 fr ...

  7. 【暑期每日一题】洛谷 P7533 [COCI2016-2017#4] Bridž

    题目链接:P7533 [COCI2016-2017#4] Bridž - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 Mirko 发明了一种卡牌游戏.卡牌只包含 A, K, ...

  8. 洛谷日常刷题(洛谷官方题单 思路+详解)

    目录 前言 非官方题单的题 P1141 01迷宫 1-4 递推与递归 P1255 数楼梯 1002 [ NOIP 2002 普及组]过河卒 P1044 [NOIP2003 普及组] 栈 P1028 [ ...

  9. 【暑期每日一题】洛谷 P7760 [COCI2016-2017#5] Tuna

    题目链接:P7760 [COCI2016-2017#5] Tuna - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 渔夫在昨晚捕到 N 条金枪鱼.他准备将这些鱼卖给一个平台 ...

最新文章

  1. 20. matlab 中的gtext 函数
  2. gear s3刷android wear,3星gear|3星gear s3自动选择手表刷机办法图文详细教程以及风险介绍...
  3. WindowsAPI开发常用资料
  4. MCP3202的使用
  5. python适合做后端开发吗-想从事Python 后端开发?
  6. 027_自己实现一个ArrayList
  7. boost之asio同步io使用实例
  8. 安徽职高计算机专业对口学校,安徽对口高考学校
  9. View的绘制-draw流程详解
  10. adobe flash player plugin_Adobe的LOGO升级了! ps图标没有描边了
  11. Activiti6 use spring-boot-starter-web meet requestMappingHandlerMapping error
  12. cad镜像后标注尺寸数字反了_CAD画法大全
  13. 微软不允许用户卸载 Chromium Edge 浏览器
  14. Java基础(一)——基本语法
  15. Linux运维问题解决(3)——VMware启动虚拟机报错 : 该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取(T)
  16. 【bzoj 3595】: [Scoi2014]方伯伯的Oj
  17. python的入门TCP编程
  18. mysql cve 扫描工具_数据库漏洞扫描
  19. 淘淘商城系列(一)—— 电商行业的背景介绍(一)
  20. Linux平台上文件同步——rsync+inotify之实时同步

热门文章

  1. 记录Yii2代码调试中出现的两个问题(截图展示)
  2. HTTP协议扫盲(一)HTTP协议的基本概念和通讯原理
  3. CSS 实现行内和上下自适应的几种方法
  4. 5个很好用的.net 分析工具
  5. Mysql 简介和创建新的数据库
  6. C++提高部分_C++函数模板_案例_数组排序---C++语言工作笔记083
  7. AndroidStudio_在android中使用properties配置文件_进行配置_只能读取配置_不能写入配置_放在assets---Android原生开发工作笔记230
  8. C++_C++中的关键字_标识符命名规则_数据类型之整形_short_int_long_longlong---C++语言工作笔记010
  9. springcloud工作笔记092---清理多余权限垃圾数据小工具
  10. Linux工作笔记033---Linux(CentOS7)安装zip、unzip命令