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

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

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

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

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

\(\mathrm{L} \times \mathrm{K}\)

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

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

输入格式

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

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

输出格式

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

【数据规模与约定】

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

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

对于 \(\%70\)的数据: \(1 \le n \le 8\),\(0 \le m \le 1000\),\(v \le 5000\)

对于 \(\%100%\)的数据: \(1 \le n \le 12\),\(0 \le m \le 1000\),\(v \le 500000\)

SOLUTION

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

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

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

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

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

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

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

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

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

解释一下,这个式子相当于就是把\(S1\) 中的点,向外扩展一层,扩展完点集为\(S\)。

\(transfer[S1][S]\) 表示从 \(S1\)到 \(S\) 的最小价值。

我们考虑S中点\(i\), 不在\(S1\) 中, 那么从\(i\) 转移到\(S1\) 的最小价值为:

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

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

然后

\(transfer[S1][S] = \sigma W[i][S1] ,i\in S, i\notin S1\)

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

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

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

其实我们考虑一个点

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

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

显然是不对的。

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

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

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

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

复杂度这样就从\(n^2\times 4^n\) 降到 \(n^2 \times 3^n\)

于是乎,贴代码。

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

#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. 水题挑战4: luogu P1280 尼克的任务

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为 \(n\) 分钟,从 ...

  2. 水题挑战1:NOIP 2013 选择客栈

    丽江河边有\(n\) 家很有特色的客栈,客栈按照其位置顺序从 \(1\) 到 \(n\) 编号.每家客栈都按照某一种色调进行装饰(总共 \(k\) 种,用整数 \(0 \sim k-1\) 表示),且 ...

  3. 水题挑战2 :NOIP提高组 2011 聪明的质监员

    小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从\(1\) 到 \(n\) 逐一编号,每个矿石都有自己的重量 \(w_i\) 以及价值 \(v_i\) .检验矿 ...

  4. [NOIp 2017]宝藏

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

  5. NOIP 2017 宝藏 - 动态规划

    题目传送门 传送门 题目大意 (家喻户晓的题目不需要题目大意) 设$f_{d, s}$表示当前树的深度为$d$,与第一个打通的点连通的点集为$s$. 每次转移的时候不考虑实际的深度,深度都当做$d$, ...

  6. 水题挑战6: CF1444A DIvision

    A. Division time limit per test1 second memory limit per test512 megabytes inputstandard input outpu ...

  7. World Finals 2017 (水题题解)

    看大佬做2017-WF,我这种菜鸡,只能刷刷水题,勉强维持生活. 赛后补补水题. 题目pdf链接,中文的,tls翻译的,链接在这里 个人喜欢在vjudge上面刷题. E Need for Speed ...

  8. 历年真题 未完成(Noip 2008 - Noip 2017)

    Noip 2008 :全部 Noip 2009 :全部 Noip 2010 :AK Noip 2011 :AK Noip 2012 : Vigenère 密码,国王游戏,开车旅行 Noip 2013 ...

  9. CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】

    CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...

随机推荐

  1. Spring Boot第四弹,一文教你如何无感知切换日志框架?

    持续原创输出,点击上方蓝字关注我吧 目录 前言 Spring Boot 版本 什么是日志门面? 如何做到无感知切换? 如何切换? 引入依赖 指定配置文件 日志如何配置? 总结 前言 首先要感谢一下读者 ...

  2. Python练习题 022:用递归函数反转字符串

    [Python练习题 022] 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来. --------------------------------------- 又来一个递归题!不过,有 ...

  3. sipp3.6对freeswitch进行压力测试

    一.安装sipp 1.下载地址: https://github-production-release-asset-2e65be.s3.amazonaws.com/13161657/99df6100-9 ...

  4. 【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫

    实时监控股市重大公告的Python爬虫小技巧 精力有限的我们,如何更加有效率地监控信息? 很多时候特别是交易时,我们需要想办法监控一些信息,比如股市的公告.如果现有的软件没有办法实现我们的需求,那么就 ...

  5. MySQL系列:Docker安装 MySQL提示错误:Access denied for user'root'@'localhost' (using password:yes)

    问题: 解决方法: 在my.conf文件里配置 [mysqld] skip-grant-tables

  6. helm部署mysql

    如果您的kubernetes已有了helm,那么部署mysql的步骤可以进一步简化,那些原先需要自己动手配置的deployment和service都已集成在chart中,今天就来实战通过helm部署m ...

  7. arduino中SCoop库的简单应用案例

    转载:https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html arduino中SCoop库的简单应用案例首先这篇文章来在视频https://v ...

  8. 《C++primerplus》第8章练习题

    1.(简单用一下引用变量,没有采用书中的题目)定义一个替身结构体,存储名字(char[])和力量值(int).使用结构体引用作为形参写两个函数,一个不加const,使得能对定义的结构体做修改,另一个加 ...

  9. 【题解】[AHOI2013]作业

    Link 题目大意:\(n\)个数,\(m\)个询问,每次四个参数,\(l,r,a,b\),问区间\([l,r]\)中出现过的,数值在\([a,b]\)区间中的数的个数以及区间\([l,r]\)中数值 ...

  10. JS原生练习

    1.输出1-10000之间的数 <script> for(i=1;i<=10000;i++) { document.write(i + "<br>") ...