[洛谷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 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ... 
随机推荐
- Kurator,你的分布式云原生解决方案
			本文分享自华为云社区<DTSE Tech Talk | 第40期:Kurator,你的分布式云原生解决方案>,作者:华为云社区精选. 什么是分布式云原生? 中国信通院给出的定义:分布式云原 ... 
- 《Kali渗透基础》05. 主动信息收集(二)
			@ 目录 1:端口扫描 2:UDP 扫描 2.1:Scapy 2.2:nmap 3:半开放扫描 3.1:Scapy 3.2:nmap 3.3:hping3 4:全连接扫描 4.1:Scapy 4.2: ... 
- 2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =
			2023-09-03:用go语言编写.给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] ... 
- MySQL面试题——隔离级别相关面试题
			隔离级别相关面试题 MySQL事务隔离级别 未提交读--可以读到其他事务未提交的数据(最新的版本) 错误现象:脏读.不可重复读.幻读的现象 提交读(RC)--可以读到其他事务已提交的数据(最新已提交的 ... 
- 【.NET8】访问私有成员新姿势UnsafeAccessor(下)
			前言 书接上回,我们讨论了在.NET8中新增的UnsafeAccessor,并且通过UnsafeAccessor访问了私有成员,这极大的方便了我们代码的编写,当然也聊到了它当前存在的一些局限性,那么它 ... 
- 「joisc2016 - D3T2」回転寿司
			题意大概是这样,「每次操作选出区间中的一个 LIS(strictly),满足其开端是极靠近左端点且大于 \(A\) 的位置,答案即这个 LIS 的末尾,做一个轮换后弹出序列末端」. 首先做几个观察. ... 
- spark修改控制台输出日志级别
			spark修改控制台输出日志级别 修改conf/log4j.properties cd $SPARK_HOME/conf cp log4j.properties.template ./log4j.pr ... 
- Java笔记(细碎小知识点)1
			1.Dos命令:dir:打出当前目录结构:md:创建文件夹:cd+文件夹地址:跳转到当前目录下的对应文件夹:cd..:跳转到上一目录:rd+文件夹:删除文件夹中东西:del+文件(或 "*. ... 
- 模块化打包工具-初识Webpack
			1. 为什么需要模块化打包工具 在上一篇文章中提到的ES Module可以帮助开发者更好地组织代码,完成js文件的模块化,基本解决了模块化的问题,但是实际开发中仅仅完成js文件的模块化是不够的,尤其是 ... 
- c++枚举详细介绍以及具体用法
			C++ 中的枚举(Enumeration)是一种用于定义命名常量集合的数据类型.枚举可以提高代码的可读性和可维护性,让您可以使用有意义的名称来表示特定的取值,而不必使用原始的数字常量. 枚举的基本语法 ... 
