[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提高组] 宝藏的更多相关文章

  1. 洛谷 3953 NOIP2017提高组Day1 T3 逛公园

    [题解] 先建反向图,用dijkstra跑出每个点到n的最短距离dis[i] 设f[u][k]表示dis(u,n)<=mindis(u,n)+k的方案数.对于边e(u,v,w),走了这条边的话需 ...

  2. 洛谷P3959 [NOIP2017]宝藏

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

  3. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  4. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

  5. 洛谷P1514 [NOIP2010提高组T4]引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

  6. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

  7. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  8. 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交

    P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...

  9. 洛谷P1313 [NOIP2011提高组Day2T1]计算系数

    P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...

  10. 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏

    Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...

随机推荐

  1. Stack Overflow开发者调查发布:AI将如何协助DevOps

    Stack Overflow 发布了开创性的2023年度开发人员调查报告 [1].报告对 90,000 多名开发人员进行了调查,全面展示了当前软件开发人员的体验.接下来,本文将重点介绍几项重要发现,即 ...

  2. 修改内置框架css 样式

    <style scoped> 1 <style scoped> 2 .info /deep/ .video{ // info 外层便签 /deep/ 可以理解为连接桥 .vid ...

  3. 作为用户我该如何调用API 接口获取商品数据

    作为用户,如果你想要获取商品数据,可以通过调用API接口来实现.下面是一些步骤和注意事项,帮助你成功获取商品数据. 了解开放平台:首先,你需要了解开放平台,注册一个开发者账号,并创建一个应用.在创建应 ...

  4. 关于前后端交互,取header的尴尬

    背景: 最近在写一个接口的时候,需求是这样的,上传excel,匹配项目有多少个字段匹配上了,如果匹配上了在单元格上标注绿色背景,然后返回excel文件和匹配的详细. 首先这个excel文件,后端是不会 ...

  5. Hadoop核心概念

    大数据开发总体架构: Hadoop是大数据开发所使用的一个核心框架.使用Hadoop可以方便的管理分布式集群,将海量数据分布式的存储在集群中,并使用分布式并行程序来处理这些数据. Hadoop由许多子 ...

  6. c语言代码练习10

    //判断输入的数字是否为素数#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int n = 0; int ...

  7. P9140 [THUPC 2023 初赛] 背包

    prologue 这很难评(调了我 1h,我都想紫砂了. 还是典型得不重构就看不见系列. analysis 如果我们还是一个正常人,那么我们大体上是能看到题目的加粗字,这个格式很明显符合我们的同余最短 ...

  8. 2023_10_10_MYSQL_DAY_02_课后题

    2023_10_10_MYSQL_DAY_02_课后题 #06章1--7题 #1. 查询10号部门所有员工的员工姓名,员工工资,工资级别. SELECT e.ename 员工姓名,e.`sal` 员工 ...

  9. Vue源码学习(十三):nextTick()方法

    好家伙,nextTick, (...这玩意,不太常用) 1.什么是nextTick 在Vue中,nextTick是一个用于异步执行回调函数的方法. 它在Vue更新DOM后被调用,以确保在下一次DOM更 ...

  10. ensp小实验——浮动路由

    依靠优先级来保证多路径的连通性. #AR1中<Huawei>u t m<Huawei>sys[Huawei]sys r1[r1]int g0/0/1 [r1-GigabitEt ...