[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. 【路由器】小米 WR30U 解锁并刷机

    本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程,整体步骤与 一般安装流程 类似,但是由于 WR30U 的解锁 ssh 和刷机的过程中有一些细节需要注意,因此记录一下 解锁 ssh 环境准备 ...

  2. 【Visual Studio 使用技巧分享】任务列表的使用

    前言 Visual Studio 开发工具的熟练使用,能够潜在的提升我们工作效率,而且一些开发技巧的使用,会让我们的工作显得那么方便快捷.那么你知道VS中有哪些你不知道的使用小技巧呢?接下来,我们就来 ...

  3. 基于velero及minio实现etcd数据备份与恢复

    1.Velero简介 Velero 是vmware开源的一个云原生的灾难恢复和迁移工具,它本身也是开源的,采用Go语言编写,可以安全的备份.恢复和迁移Kubernetes集群资源数据:官网https: ...

  4. .NET开源最全的第三方登录整合库 - CollectiveOAuth

    前言 我相信很多同学都对接过各种各样的第三方平台的登录授权获取用户信息(如:微信登录.支付宝登录.GitHub登录等等).今天给大家推荐一个.NET开源最全的第三方登录整合库:CollectiveOA ...

  5. role

    角色权限管理改造方案 #   为什么需要角色 现有的权限方案 .net后台权限管理 在后台类中配置,权限 = 一级菜单:二级菜单:三级菜单: 通过在view模板中判断是否有权限显示菜单 后端通过权限配 ...

  6. 安卓APK签名注入大师(APP注入弹窗,注入打开密码,注入过期时间, 注入提示信息,一机一码)

    安卓APK签名注入大师可以给安卓APK文件一键注入APP注入弹窗,注入打开密码,注入过期时间, 注入提示信息,一机一码等功能,方便开发人员给自己的APK文件添加消息提示, 密码等功能. 可以保护文件安 ...

  7. 兴达易控modbus转profinet网关三菱变频器通讯

    兴达易控modbus转profinet网关与三菱变频器通讯 本案例分享兴达易控modbus转profinet网关(MDPN100)连接西门子1200plc,实现三菱变频器485通讯兼容转modbusT ...

  8. Python网络编程——TCP套接字通信、通信循环、链接循环、UDP通信

    文章目录 基于TCP的套接字通信 加上通信循环 加上链接循环 基于UDP协议的套接字通信 基于TCP的套接字通信 以买手机的过程为例 服务端代码 import socket # 1.买手机 phone ...

  9. 随身wifi 救砖过程记录

    7,8块钱买了个随身wifi,准备刷机玩的,后来不知道刷错了boot还是啥,加电后灯都不亮了,前期没备份,于是网上找了各种教程,下面记录下: 变砖后有个底层的9008驱动协议可以刷机,下面的过程都是基 ...

  10. 博弈论(Nim游戏 , 有向图游戏)

    博弈论专题 Nim游戏 内容: 有 n 堆石子,每堆石子的石子数给出,甲乙两人回合制取石子,每次可以取任意一堆石子的任意多个(可以直接取完,但不能不取),每个人都按照最优策略来取(抽象),问先手必胜或 ...