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

Sample Input2
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 2
Sample Output2
5
Sample Explanation2

HINT
对于 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$
题解
很容易想到最后构成的图就是一棵树。
比较容易想到的$70pts$就是用搜索来确定这棵树的形态。
我们先枚举根节点,再搜索来确定其父节点。
正解则是子集$DP$了。
我们考虑到什么状态是无后效性的?记$f_{dep,i}$,表示生成树中最深的点深度为$dep$,选点的状态为$i$的最小花费。
转移的话就是考虑第$dep+1$层需要连接哪些点,即$$f_{dep+1,i|j} = min \{f_{dep,i}+(dep+1)*qval_{j,i}\}$$
其中$j$表示第$dep+1$层连的点,$i∩j = \emptyset$;$qval_{j,i}$表示集合$j$中所有的点连向集合$i$中的点最小花费和。
对于$qval$的值我们可以通过$$qval_{j,i} = \sum_{u∈j} sval_{u,i}$$
计算出,其中$sval_{u,i}$表示点$u$到集合$i$中的点最小距离。
显然$$sval_{u,i} = \min_{v∈i} \{w[u][v]\}$$
值得注意的是,其中会有很多不合法的状况,比如对于转移时$j$集合中的点并不是严格的在第$dep+1$层。但可以证明的是,这种不合法的情况总比最优解差。我们允许这种不合法的情况存在。
时间复杂度$O(3^n*n^2)$。
//Is is made by Awson on 2017.12.17
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;
const int N = ;
const int SIZE = <<;
const int INF = ~0u>>; int n, m, u, v, c, U;
int g[N+][N+];
LL sval[N+][SIZE+], qval[SIZE+][SIZE+], f[N+][SIZE+]; void work() {
scanf("%d%d", &n, &m); U = (<<n)-;
memset(g, , sizeof(g));
for (int i = ; i <= m; i++) {
scanf("%d%d%d", &u, &v, &c);
g[u][v] = g[v][u] = Min(c, g[u][v]);
}
memset(sval, /, sizeof(sval));
for (int u = ; u <= n; u++)
for (int i = ; i <= U; i++)
for (int v = ; v <= n; v++)
if ((<<v-)&i) sval[u][i] = Min(sval[u][i], 1ll*g[u][v]);
memset(qval, /, sizeof(qval));
for (int i = ; i <= U; i++) {
int C = i^U;
for (int j = C; j; j = (j-)&C) {
LL cnt = ;
for (int u = ; u <= n; u++)
if ((<<u-)&j) cnt += sval[u][i];
qval[j][i] = Min(qval[j][i], cnt);
}
}
LL ans = 1ll*INF;
for (int root = ; root <= n; root++) {
memset(f, /, sizeof(f)); LL inf = f[][];
f[][<<root-] = ;
for (int dep = ; dep < n; dep++)
for (int i = ; i <= U; i++) if (f[dep][i] != inf) {
int C = i^U;
for (int j = C; j; j = (j-)&C)
f[dep+][i|j] = Min(f[dep+][i|j], f[dep][i]+qval[j][i]*(dep+));
}
for (int i = ; i < n; i++) ans = Min(ans, f[i][U]);
}
printf("%lld\n", ans);
}
int main() {
work();
return ;
}
[NOIp 2017]宝藏的更多相关文章
- 水题挑战3: NOIP 2017 宝藏
参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的 \(m\) 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋 ...
- NOIP 2017 宝藏 - 动态规划
题目传送门 传送门 题目大意 (家喻户晓的题目不需要题目大意) 设$f_{d, s}$表示当前树的深度为$d$,与第一个打通的点连通的点集为$s$. 每次转移的时候不考虑实际的深度,深度都当做$d$, ...
- 历年真题 未完成(Noip 2008 - Noip 2017)
Noip 2008 :全部 Noip 2009 :全部 Noip 2010 :AK Noip 2011 :AK Noip 2012 : Vigenère 密码,国王游戏,开车旅行 Noip 2013 ...
- NOIP 2017 解题报告
---恢复内容开始--- NOIP 2017 的题真的很难啊,怪不得当年我这个萌新爆零了(当然现在也是萌新)越学越觉得自己什么都不会. 想要成为强者要把这些好题都弄懂弄透 至少现在6道题我都比较陌生 ...
- NOIP 2017 列队 - Splay - 树状数组
题目传送门 传送点I 传送点II 题目大意 (家喻户晓的题目应该不需要大意) (我之前咋把NOIP 2017打成了NOIP 2018,好绝望) Solution 1 Splay 每行一颗Splay,没 ...
- 【游记】NOIP 2017
时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...
- NOIP 2017 小凯的疑惑
# NOIP 2017 小凯的疑惑 思路 a,b 互质 求最大不能表示出来的数k 则k与 a,b 互质 这里有一个结论:(网上有证明)不过我是打表找的规律 若 x,y(设x<y) 互质 则 : ...
- 「NOIP 2017」列队
题目大意:给定一个 $n times m$ 的方阵,初始时第 $i$ 行第 $j$ 列的人的编号为 $(i-1) times m + j$,$q$ 次给出 $x,y$,让第 $x$ 行 $y$ 列的人 ...
- 洛谷 P3951 NOIP 2017 小凯的疑惑
洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...
随机推荐
- 【Spring系列】自己手写一个 SpringMVC 框架
参考文章 一.了解SpringMVC运行流程及九大组件 1.SpringMVC的运行流程 1)用户发送请求至前端控制器DispatcherServlet 2)DispatcherServlet收到请求 ...
- oralce数据库常用到的一些sql命令(加字段注释,修改数据之类)
最近开始接触oralce,整理了一下最近使用 pl/sql 常用到的一些sql命令 1.修改表中的数据 编写查询语句及条件,然后加上"FOR UPDATE","FOR U ...
- fabric.js和高级画板
本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式.网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角 ...
- HTML事件处理程序
事件处理程序中的代码执行时,有权访问全局作用域中任何代码. //为按钮btn_event添加了两个个事件处理程序,而且该事件会在冒泡阶段触发(最后一个参数是false). var btn_event ...
- Mybatis和Hibernate本质区别和应用场景
Hibernate:是一个标准ORM(对象关系映射)框架.入门门槛较高,不需要程序员写sql语句,sql语句自动生成,对sql语句优化.修改比较困难 应用场景:适用于需求变化不多的中小型项目,比如后台 ...
- python3+beautifulSoup4.6抓取某网站小说(四)多线程抓取
上一篇多文章,是二级目录,根目录"小说",二级目录"作品名称",之后就是小说文件. 本篇改造了部分代码,将目录设置为根目录->作者目录->作品目录- ...
- MySql入门(2-2)创建数据库
mysql -u root -p; show databases; create database apigateway; use apigateway; show tables;
- spring8——AOP之Bean的自动代理生成器
对于上篇博客http://www.cnblogs.com/cdf-opensource-007/p/6464237.html结尾处提到的两个问题,可以使用spring提供的自动代理生成器解决.自动代理 ...
- An invalid character [32] was present in the Cookie value 错误
今天在做cookie部分的demo的时候出现了一个错误Servlet部分的代码如下 Date data=new Date(); SimpleDateFormat format=new SimpleDa ...
- 初试valgrind内存调试工具
虽然GDB调试工具功能强大,但对于平时做题调试的使用并不方便,这里尝试学习使用比较简单的valgrind工具 Valgrind是一个提供程序调试及性能分析的工具集.其包含的工具主要有Memcheck, ...