题目传送门

  传送门

题目大意

  (家喻户晓的题目不需要题目大意)

  设$f_{d, s}$表示当前树的深度为$d$,与第一个打通的点连通的点集为$s$。

  每次转移的时候不考虑实际的深度,深度都当做$d$,寻找连接两个点集最小边集,如果能连接更浅的点,那么会在之前转移,所以即使转移非法也不可能成为最优解。

  找连接两个点集的最小边集合可以预处理。

  我比较懒,不想预处理,时间复杂度$O(n^{2}3^{n})$。

Code

 /**
* uoj
* Problem#333
* Accepted
* Time: 123ms
* Memory: 1412k
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef bool boolean; const int N = , S = << N;
const signed inf = (signed) (~0u >> ); template <typename T>
void pfill(T* pst, const T* ped, T val) {
for ( ; pst != ped; *(pst++) = val);
} int n, m;
int g[N][N];
int f[N + ][S];
int cost[S]; inline void init() {
scanf("%d%d", &n, &m);
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
g[i][j] = inf;
for (int i = , u, v, w; i < m; i++) {
scanf("%d%d%d", &u, &v, &w), u--, v--;
g[v][u] = g[u][v] = min(g[u][v], w);
}
} int id[S];
inline void solve() {
int S = ( << n);
pfill(f[], f[n + ], inf);
pfill(cost, cost + S, inf);
for (int i = ; i < n; i++)
id[ << i] = i;
for (int i = ; i < n; i++)
f[][ << i] = ;
int ans = f[][S - ];
for (int d = ; d <= n; d++) {
for (int s = , val; s < S; s++) {
if ((val = f[d - ][s]) == inf)
continue;
cost[] = ;
for (int ns = (s + ) | s, cs, w, wc, cur; ns < S; ns = (ns + ) | s) {
cs = (ns ^ s), w = cost[cs ^ (cs & (-cs))], wc = inf;
if (w == inf)
continue;
cur = id[(cs & (-cs))];
for (int i = ; i < n; i++)
if (s & ( << i))
wc = min(wc, g[cur][i]);
if (wc == inf)
continue;
f[d][ns] = min(f[d][ns], val + (w + wc) * (d - ));
cost[cs] = w + wc;
} for (int ns = s; ns < S; ns = (ns + ) | s)
cost[ns ^ s] = inf;
}
ans = min(ans, f[d][S - ]);
}
printf("%d\n", ans);
} int main() {
init();
solve();
return ;
}

NOIP 2017 宝藏 - 动态规划的更多相关文章

  1. [NOIp 2017]宝藏

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

  2. 水题挑战3: NOIP 2017 宝藏

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

  3. 历年真题 未完成(Noip 2008 - Noip 2017)

    Noip 2008 :全部 Noip 2009 :全部 Noip 2010 :AK Noip 2011 :AK Noip 2012 : Vigenère 密码,国王游戏,开车旅行 Noip 2013 ...

  4. Luogu 1060 开心的金明 / NOIP 2006 (动态规划)

    Luogu 1060 开心的金明 / NOIP 2006 (动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨 ...

  5. NOIP 2017 解题报告

    ---恢复内容开始--- NOIP 2017 的题真的很难啊,怪不得当年我这个萌新爆零了(当然现在也是萌新)越学越觉得自己什么都不会. 想要成为强者要把这些好题都弄懂弄透 至少现在6道题我都比较陌生 ...

  6. NOIP 2017 列队 - Splay - 树状数组

    题目传送门 传送点I 传送点II 题目大意 (家喻户晓的题目应该不需要大意) (我之前咋把NOIP 2017打成了NOIP 2018,好绝望) Solution 1 Splay 每行一颗Splay,没 ...

  7. 【游记】NOIP 2017

    时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...

  8. NOIP 2017 小凯的疑惑

    # NOIP 2017 小凯的疑惑 思路 a,b 互质 求最大不能表示出来的数k 则k与 a,b 互质 这里有一个结论:(网上有证明)不过我是打表找的规律 若 x,y(设x<y) 互质 则 : ...

  9. 「NOIP 2017」列队

    题目大意:给定一个 $n times m$ 的方阵,初始时第 $i$ 行第 $j$ 列的人的编号为 $(i-1) times m + j$,$q$ 次给出 $x,y$,让第 $x$ 行 $y$ 列的人 ...

随机推荐

  1. Centos-7.4_安装_Redis_4.0.8

    一.安装redis 第一步:下载redis安装包 [root@Redis ~]# mkdir /usr/local/redis/ --创建目录 [root@Redis redis]# cd /usr/ ...

  2. python之for循环

    for循环,也称定循环,即一般用于循环次数确定的循环,通常可用于遍历序列,如字符串str,列表list,元组tuple等 格式: for 变量 in 序列: command1 command2 ... ...

  3. Windows Server 2012 R2服务器部署Tomcat JDK、安装Mysql以及将Java项目部署到CVM

    我们平时所调试的Java Web 项目需要在本地Eclipse或者MyEclipse当中开发调试,并且部署到Tomcat上来测试,比如说笔者这里用的eclipse添加tomcat服务器, 但是这里发布 ...

  4. CAS单点登录入门

    一.单点登录简介 SOO是现在企业比较流行的业务整合解决方案之一,定义解决登录,可以应用在不同系统中,用户只需要登录一次,就可以访问所有相互信任的应用系统(模块开发.同家公司不同产品等等),例如百度, ...

  5. windy数

    windy数指的是相邻两位差至少为2的数.问区间[a,b]中有多少个windy数 调了半个多小时,不过调出来之后对数位dp理解大大加深 #include<iostream> #includ ...

  6. Vue中import引入模块路径时的@符号

    1.ES6 模块主要有两个功能:export 和 import export:用户对外输出本模块(一个文件可以理解为一个模块,比如 aaa.js bbb.js)变量的接口 . import:用于在一个 ...

  7. SQL使用之关联更新、批量插入

    使用场景 某个字段数据异常,利用另外一张表同步修改该表异常字段的数据; 关联更新 UPDATE tableName1 AS t1 LEFT JOIN tableName12 AS t2 ON t1.x ...

  8. what's the 白盒测试

    what's the 白盒测试 白盒测试又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试.盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的.白盒要考虑测试 ...

  9. Java8(1)之Lambda表达式初步与函数式接口

    Lambda表达式初步 介绍 什么是Lambda表达式? 在如 Lisp.Python.Ruby 编程语言中,Lambda 是一个用于表示匿名函数或闭包的运算符 为何需要lambda表达式? 在 Ja ...

  10. Linux的top命令学习【转载】

    转自:https://blog.csdn.net/sanshiqiduer/article/details/1933625 1.top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的 ...