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

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

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

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

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

L×K\mathrm{L} \times \mathrm{K}L×K

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

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

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

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

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

【数据规模与约定】

对于 %20\%20%20的数据: 保证输入是一棵树,1≤n≤81 \le n \le 81≤n≤8,v≤5000v \le 5000v≤5000 且所有的 vvv 都相等。

对于 %40\%40%40的数据: 1≤n≤81 \le n \le 81≤n≤8,0≤m≤10000 \le m \le 10000≤m≤1000,v≤5000v \le 5000v≤5000 且所有的 vvv都相等。

对于 %70\%70%70的数据: 1≤n≤81 \le n \le 81≤n≤8,0≤m≤10000 \le m \le 10000≤m≤1000,v≤5000v \le 5000v≤5000

对于 %100\%100%%100的数据: 1≤n≤121 \le n \le 121≤n≤12,0≤m≤10000 \le m \le 10000≤m≤1000,v≤500000v \le 500000v≤500000

##SOLUTION

好吧其实这题还是有点难的,蒟蒻我当时还是在考场上拿到这题一脸懵逼。

看到这题的规模,n≤12n \le 12n≤12,一般就会有几种想法:爆搜,状压(还有大佬写的模拟退火。。。是本弱弱不会的了) 。

由题意可得,我们求完之后会是一棵树,图上找一棵树。

首先,我们想到某一个点iii 作为这个图中树的根,对于其他点,我们关心其他点到起点的距离。

对于第一部分分,我们只需要对每一个根做一次树形DP即可。

之后变成了一个图,我们考虑状态压缩。

我们记 f[S][i]f[S][i]f[S][i] , 表示我们对于状态为 SSS 的点集,最深层数为 iii 。

然后我们可以稍微思考一下,对于点集 SSS ,他可以由自己的子点集 S1S1S1 转移而来, ,于是,我们就有:

f[S][d]=minf[S1][d−1]+(d−1)×transfer[S1][S],S1⊂Sf[S][d] = min{f[S1][d-1] + (d-1) \times transfer[S1][S]}, S1\subset Sf[S][d]=minf[S1][d−1]+(d−1)×transfer[S1][S],S1⊂S

解释一下,这个式子相当于就是把S1S1S1 中的点,向外扩展一层,扩展完点集为SSS。

transfer[S1][S]transfer[S1][S]transfer[S1][S] 表示从 S1S1S1到 SSS 的最小价值。

我们考虑S中点iii, 不在S1S1S1 中, 那么从iii 转移到S1S1S1 的最小价值为:

W[i][S1]=min(e[i][j]),j∈S1W[i][S1] = min(e[i][j]), j \in S1W[i][S1]=min(e[i][j]),j∈S1

但是事实上这个W数组是不用写出来的,一次次加上去就好了。

然后

transfer[S1][S]=σW[i][S1],i∈S,i∉S1transfer[S1][S] = \sigma W[i][S1] ,i\in S, i\notin S1transfer[S1][S]=σW[i][S1],i∈S,i∈/​S1

但是吧,不知道大家有没有这个困惑

#我们压根没考虑根节点!!

在我写完时候也有点纠结(纠结了好久,写完才想到)

其实我们考虑一个点

我不会画画(偷懒),引用了大佬的博客GoldenPotato的OI世界

考虑这个图里,我们以图中给的为根,如果我们统计k=1时候没有加最右边的一个点,到k=2的状态时把这个点算进去,那不是距离根节点只有一个宝藏屋的边要×2\times 2×2

显然是不对的。

但是我们可以在其他点为根的状态中,把这个点加进去,就一定会有最优的解。

所以我们的答案统计为: ans=minf[i][(1<<n)−1],i∈[1,n]ans = min{f[i][(1<<n)-1], i \in [1,n]}ans=minf[i][(1<<n)−1],i∈[1,n]

还有一个小技巧,就是枚举子集,

 for(int s1=s; s1; s1=(s1-1)&s)

复杂度这样就从n2×4nn^2\times 4^nn2×4n 降到 n2×3nn^2 \times 3^nn2×3n

于是乎,贴代码。

如果我哪里有疏漏,欢迎大家指正~

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define _(d) while(d(isdigit(ch=getchar())))
template <class T> void g(T&t){T x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=x*10+ch-48;t=f*x;}
typedef long long ll;
const int N=14;
int n, m, inf, tr[1<<N][1<<N], e[N][N];ll f[N][1<<N];
int main(){g(n), g(m);memset(e, 63, sizeof(e)); inf = e[0][0];rep(i,1,m){int x, y, z; g(x), g(y), g(z);e[x][y] = e[y][x] = min( e[x][y], z );}rep(s, 0, (1<<n)-1){for(int s1=s; s1; s1=(s1-1)&s){int tmp= s ^ s1;bool flag=0;rep(i, 1, n){if( 1<<(i-1) & tmp ){int tt= inf;rep(j, 1, n){if( 1<<(j-1) & s1){tt= min( tt, e[i][j] );}}if( tt == inf ){flag = 1;break;}tr[s1][s] += tt;}}if( flag ){tr[s1][s] = inf;}}    }memset(f, 63, sizeof(f));ll ans=f[0][0]; rep(i, 1, n) f[1][1<<(i-1)] = 0;rep(i, 2, n){rep( s, 0, (1<<n)-1 )for(int s1=s; s1; s1=(s1-1) & s ){if(tr[s1][s]!=inf)f[i][s]=min(f[i][s], f[i-1][s1] + tr[s1][s]*(i-1) );}}rep(i, 1, n) ans=min(ans, f[i][(1<<n)-1]);printf("%lld\n",ans);return 0;
}

水题挑战3:NOIP 2017 宝藏相关推荐

  1. 水题 逆序对 NOIP 2013 火柴排队

    题目如下 题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ,其中 a ...

  2. 2017西安交大ACM小学期数论 [水题]

    水题 发布时间: 2017年6月25日 14:06   最后更新: 2017年7月3日 09:27   时间限制: 1000ms   内存限制: 128M 描述 平均因数个数的统计对于估算数论题目复杂 ...

  3. NOIP 2017 Day1 T2 时间复杂度 complexity - 模拟题 题解

    作者@豪哒哒哒HaoDaDaDa 转载自简书@豪哒哒哒HaoDaDaDa-简书-NOIP 2017 Day1 T2 时间复杂度 (有一个月没有写简书了-) (这次终于开始拿Markdown写了,富文本 ...

  4. 【闯王的宝藏】 水题 链表

    闯王的宝藏 题目描述 [题目背景] 明朝后期,由于皇帝腐朽无能,宦官专权,政治黑暗腐败.官僚地主霸占了全国绝大部 分的良田沃土,很多农民失去了土地,政府还不断地向农民征收赋税,困苦不堪的农民又遭 到蝗 ...

  5. NOIP 2017 提高组 初赛

    NOIP 2017 提高组 初赛 做题感悟. 五.完善程序,是本张试卷最简单的题目,两道题做完,大约花了10分钟.2017-10-17 18:25 对了答案,破天荒,全对. 1.(大整数除法) 有如下 ...

  6. 【游记】NOIP 2017

    时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...

  7. hdu 2025:查找最大元素(水题,顺序查找)

    查找最大元素 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. NOIP 2017 游记

    大家都写,我也来凑热闹 PS:用双拼可真是累啊.. (用双拼打了四行以后我决定以后再也不用双拼了!) DAY 0 颓废日,上午跑到机房颓废可真是爽 但是我坚持自我 day-2时下定决心买了阿里云的服务 ...

  9. DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》证书考试历年真题及其解析之2017年/2018年

    DayDayUp:计算机技术与软件专业技术资格证书之<系统集成项目管理工程师>证书考试历年真题及其解析之2017年/2018年 目录 2017年 2017年11月上午<系统集成项目管 ...

最新文章

  1. LSGO代码小组第18周复盘日志
  2. 上拉加载下拉刷新了解下
  3. SpringBoot - 优雅的实现【异步编程】
  4. linux——sshd服务及其管理命令
  5. 怎样才算得上合格的程序员
  6. Java 文件操作一(写文件、按行读文件、删除文件、复制文件、追加数据、创建临时文件、修改最后修改日期、获取文件大小)
  7. 查询(python 版)
  8. python发布_python如何发布模块
  9. H2 database 操作操作内存表
  10. 用python的pandas打开csv文件_使用CSV模块和Pandas在Python中读取和写入CSV文件
  11. bootstrapmodel确认操作框_光伏电站EL检测仪的操作流程
  12. DXperience 7.1.1
  13. 莫烦-pytorch
  14. 实践应用|Python自动化连接FTP批量下载指定文件
  15. python模拟键盘上键和回车_python + selenium 模拟键盘升级版PyUserInput
  16. java实战--GC终极总结
  17. matlab的死区环节,基于SIMULINK对非线性系统死区环节进行仿真
  18. 卧龙图甄选 | 惊蛰来到,万物复苏,春天的气息扑面而来
  19. web渗透测试实战-SQLMAP
  20. 基于STM32G431嵌入式学习笔记——一、LED模块入门

热门文章

  1. 怎样将网页保存为html,如何将网页保存为书签
  2. 我有一个网络工程师的梦
  3. 行业研究分析-全球与中国Type-C数据线市场现状及未来发展趋势
  4. 中国工程师最喜欢的10大TWS耳机电源管理芯片,钰泰ETA9084名列其中
  5. 金融相关时间序列分析全指南
  6. 383计算机毕业设计
  7. 贴片电容的X5R X7R是什么意思
  8. 麦克斯韦方程组学习心得与记录
  9. 自增,自减(java为例)
  10. 计算机除尘的操作步骤,PC除尘降温不求人 脚本之家手把手教你如何清理电脑