[洛谷P3959][NOIP2017提高组] 宝藏
[NOIP2017 提高组] 宝藏
题目描述
参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的 \(m\) 条道路和它们的长度。
小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远,也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路则相对容易很多。
小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。
在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以 任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏屋之间的道路无需再开发。
新开发一条道路的代价是 \(\mathrm{L} \times \mathrm{K}\)。其中 \(L\) 代表这条道路的长度,\(K\) 代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。
请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代价最小,并输出这个最小值。
输入格式
第一行两个用空格分离的正整数 \(n,m\),代表宝藏屋的个数和道路数。
接下来 \(m\) 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏屋的编号(编号为 \(1-n\)),和这条道路的长度 \(v\)。
输出格式
一个正整数,表示最小的总代价。
样例 #1
样例输入 #1
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1
样例输出 #1
4
样例 #2
样例输入 #2
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 2
样例输出 #2
5
提示

【样例解释 \(1\)】
小明选定让赞助商打通了 \(1\) 号宝藏屋。小明开发了道路 \(1 \to 2\),挖掘了 \(2\) 号宝藏。开发了道路 \(1 \to 4\),挖掘了 \(4\) 号宝藏。还开发了道路 \(4 \to 3\),挖掘了 \(3\) 号宝藏。
工程总代价为 $1 \times 1 + 1 \times 1 + 1 \times 2 = 4 $。
【样例解释 \(2\)】
小明选定让赞助商打通了 \(1\) 号宝藏屋。小明开发了道路 \(1 \to 2\),挖掘了 \(2\) 号宝藏。开发了道路 \(1 \to 3\),挖掘了 \(3\) 号宝藏。还开发了道路 \(1 \to 4\),挖掘了 \(4\) 号宝藏。
工程总代价为 \(1 \times 1 + 3 \times 1 + 1 \times 1 = 5\)。
【数据规模与约定】
对于 $ 20%$ 的数据: 保证输入是一棵树,\(1 \le n \le 8\),\(v \le 5\times 10^3\) 且所有的 \(v\) 都相等。
对于 \(40\%\) 的数据: \(1 \le n \le 8\),\(0 \le m \le 10^3\),\(v \le 5\times 10^3\) 且所有的 \(v\) 都相等。
对于 $ 70%$ 的数据: \(1 \le n \le 8\),\(0 \le m \le 10^3\),\(v \le 5\times 10^3\)。
对于 $ 100%$ 的数据: \(1 \le n \le 12\),\(0 \le m \le 10^3\),\(v \le 5\times 10^5\)。
这个数据范围,一看就知道是状压 dp。同时肯定是一层一层dp的。
定义 \(dp_{i,s1,s2}\) 为现在层数为 \(i\),已经开通了的点是 \(s1\),最后一层是 \(s2\),然后要枚举 \(s3\) 为下一层所连的点集合,转移。
但是这样复杂度会爆炸。发现其实 \(s2\) 不用记在 dp 范围内。因为当 \(s3\) 接到不是最近一层的点时,他的代价会更劣,本来没有 \(i\) 层被算成了 \(i\) 层。所以我们只要找出 \(s1\) 和 \(s3\) 的所有连接方式中最优的就行了。
\(s3\) 子集枚举,复杂度 \(O(n3^n)\)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=13;
int n,m,g[N][N];
LL ans=1e18,dp[1<<N][N];//dp[s][i]:
int main()
{
memset(dp,0x7f,sizeof(dp));
memset(g,0x7f,sizeof(g));
scanf("%d%d",&n,&m);
for(int i=1,u,v,w;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w),--u,--v;
g[u][v]=g[v][u]=min(g[u][v],w);
}
for(int i=0;i<n;i++)
dp[1<<i][1]=0;
for(int i=1;i<(1<<n);i++)
{
for(int j=i&(i-1);j;j=(j-1)&i)
{
// printf("%d %d\n",i,j);
int s=i^j,ret=0,fl=0;
for(int a=0;a<n;a++)
{
if(j>>a&1)
{
int mn=1e6;
for(int b=0;b<n;b++)
if(s>>b&1&&g[a][b])
mn=min(mn,g[a][b]);
if(mn==1e6)
fl=1,a=n;
ret+=mn;
}
}
if(fl)
continue;
for(int k=2;k<=n;k++)
dp[i][k]=min(dp[i][k],dp[s][k-1]+ret*1LL*(k-1));
}
}
// for(int i=1;i<(1<<n);i++)
// {
// for(int j=1;j<=n;j++)
// printf("%d ",dp[i][j]);
// puts("");
// }
for(int i=1;i<=n;i++)
ans=min(ans,dp[(1<<n)-1][i]);
printf("%lld",ans);
}
[洛谷P3959][NOIP2017提高组] 宝藏的更多相关文章
- 洛谷 3953 NOIP2017提高组Day1 T3 逛公园
[题解] 先建反向图,用dijkstra跑出每个点到n的最短距离dis[i] 设f[u][k]表示dis(u,n)<=mindis(u,n)+k的方案数.对于边e(u,v,w),走了这条边的话需 ...
- 洛谷P3959 [NOIP2017]宝藏
[题目描述] 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但 ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)
题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...
- 洛谷P1514 [NOIP2010提高组T4]引水入城
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...
- 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制
P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
- 洛谷P1083 [NOIP2012提高组Day2T2]借教室
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
- 洛谷P1313 [NOIP2011提高组Day2T1]计算系数
P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...
- 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏
Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
随机推荐
- (null) entry in command string: null chmod 0644
在WIndows操作系统中本地运行spark程序,报以下错误: ....(null) entry in command string: null chmod 0644 ..(后面是目的目录) 解决方法 ...
- 3步体验在DAYU200开发板上完成OpenHarmony对接华为云IoT
本文分享自华为云社区<DAYU200+OpenHarmony 3.1.1对接华为云IOT[华为云IoT+鸿蒙]>,作者:DS小龙哥. 一.前言 OpenHarmony 3.1.1 是一个开 ...
- Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错.内容较长,我就不翻译了,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读. 测试场景 作者采用了一个尽 ...
- nginx URLRewrite基础配置
环境准备: 主机 ip control01 192.168.29.128 nginx01 192.168.29.101 在两台机器上分别部署nginx control01主机nginx配置的内容如下: ...
- 新零售SaaS架构:面向中小连锁的SaaS系统整体规划
零售企业的发展路径 零售企业的发展路径一般可分为以下几个阶段: 单店经营阶段:企业在一个地区或城市开设单个门店.这时,企业需要把精力放在了解当地市场和顾客需求上,这是积累经验和品牌知名度的重要环节.为 ...
- oracle-查看oracle当前连接数,会话数
查看当前系统允许的进程连接数:方法一: show parameter process; 查看processes一列 方法二: select name,value from v$parameter wh ...
- pandas处理大数据题目的操作
1.用法:DataFrame.drop(labels=None, axis=0, index=None, columns=None, inplace=False) 2.参数说明: labels:要删除 ...
- Informix 4gl错误代码信息和更正
(一)Informix信息和更正 出版日期:6 1996 年 年 1 11 月 0 成功. 操作成功.当 SQL 语句成功地执行时,数据库服务器把这个 SQLCODE 值返回给应用程序. 100 没有 ...
- 聊聊Maven的依赖传递、依赖管理、依赖作用域
1. 依赖传递 在Maven中,依赖是会传递的,假如在业务项目中引入了spring-boot-starter-web依赖: <dependency> <groupId>org. ...
- CDQ分治和三维偏序
专题:CDQ 分治 本页面将完整介绍 CDQ 分治. 简介 CDQ 分治是一种思想而不是具体的算法,与动态规划类似.目前这个思想的拓展十分广泛,依原理与写法的不同,大致分为三类: 解决和点对有关的问题 ...