题目大意:给定一个有重边,边有权值的无向图。从某一个点出发,求到达所有的点需要的最少费用,并且限制两点之间只有一条路径。费用的计算公式为:所有边的费用之和。而边$x->y$的费用就为:$y$到初始点的之间点的个数(包括起始点) $\times$ 边权。

题解:状压$DP$,令$f_{i,j}$表示当前深度为$i$,状态为$j$的最小花费

$$f_{i,s}=f_{i-1,t}+g_{s,t}\times(i−1)$$

再开一个数组$c_{s,i}表示状态$s$挖到点$i$的最小花费(不考虑深度)

用边权更新$c$数组,再用$c$数组更新$g$数组即可

卡点:1.$c$数组第二维开太小

C++ Code:

#include <cstdio>
#include <cstring>
#define lb(x) (x & -x)
#define maxn 13
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, U, ans = inf;
int e[maxn][maxn], c[maxn][1 << maxn | 3];
int g[1 << maxn | 3][1 << maxn | 3], f[maxn][1 << maxn | 3];
inline void getmin(int &a, int b) {if (a > b) a = b;}
inline int min(int a, int b) {return a < b ? a : b;}
int main() {scanf("%d%d", &n, &m); U = 1 << n;if (n == 1) {puts("0");return 0;}memset(e, 0x3f, sizeof e);for (int i = 0; i < m; i++) {int a, b, c;scanf("%d%d%d", &a, &b, &c);e[a][b] = e[b][a] = min(c, e[a][b]);}for (int i = 1; i <= n; i++) {for (int j = 1; j < U; j++) {c[i][j] = inf;if (!(j & (1 << i - 1))) {for (int k = 1; k <= n; k++) {if (j & (1 << k - 1)) getmin(c[i][j], e[i][k]);}}}}for (int i = 1; i < U; i++) {for (int j = i & i - 1; j; j = i & j - 1) {int tmp = i ^ j;for (int k = 1; k <= n; k++) {if (tmp & (1 << k - 1)) {g[i][j] += c[k][j];if (g[i][j] > inf) g[i][j] = inf;}}}}memset(f, 0x3f, sizeof f);for (int i = 1; i <= n; i++) f[1][1 << i - 1] = 0;for (int i = 2; i <= n; i++) {for (int j = 1; j < U; j++) {for (int k = j & j - 1; k; k = j & k - 1) {int tmp = inf;if (g[j][k] ^ inf) tmp = g[j][k] * (i - 1);if (f[i - 1][k] ^ inf) getmin(f[i][j], f[i - 1][k] + tmp);}}getmin(ans, f[i][U - 1]);}printf("%d\n", ans);return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/9504801.html

[NOIP2017 TG D2T2]宝藏相关推荐

  1. [NOIP2017 TG D2T2]宝藏(模拟退火)

    题目大意:$NOIPD2T2$宝藏 题解:正常做法:状压DP .这次模拟退火,随机一个排列,$O(n^2)$贪心按排列的顺序加入生成树 卡点:没开$long\;long$,接受较劣解时判断打错,没判$ ...

  2. P3959 [NOIP2017 提高组] 宝藏

    P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说,就是n个点m个边,选定一个点为根节点,构造一个最小生成树,边的权值为该该边起点到根节点之间的点的数量K(不含根节点) * 道路长度 ...

  3. 【NOIP题解】NOIP2017 TG D2T3 列队

    列队,NOIP2017 TG D2T3. 树状数组经典题. 题目链接:洛谷. 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. ...

  4. [SinGuLaRiTy] NOIP2017 提高组

    [SinGuLaRiTy-1048] Copyright (c) SinGuLaRiTy 2018. All Rights Reserved. NOIP2017过了这么久,现在2018了才找到寒假这么 ...

  5. CSP -S1/J1 初赛复习

    目录 写在前面 文件大小计算 位图大小的计算 进制转换 二进制转十进制 / K进制转十进制 八进制 / 十六进制 与二进制的互相转换 时间复杂度计算 求通项公式法 蒙猜法 零碎知识 CCF颂歌 计算机 ...

  6. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

  7. 简单的题解 属2017

    -- 待补充 P3958 [NOIP2017 提高组] 奶酪 刷过,当时没一次过 因为没看出来是dfs,以及没有交代码前编译 P3959 [NOIP2017 提高组] 宝藏 两次没过,第三次过了,最后 ...

  8. 『宝藏 状态压缩DP NOIP2017』

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

  9. #333. 【NOIP2017】宝藏

    #333. [NOIP2017]宝藏 http://uoj.ac/problem/333 1.错误的$n^42^n$做法: dp[s]表示当前的点集为s,然后从这些点中选一个做起点i,然后枚举边,然后 ...

最新文章

  1. 关于变量名前面加m的问题
  2. JavaScript的基本语法
  3. CImage类 from http://www.cnblogs.com/afarmer/archive/2012/03/31/2427273.html
  4. vue项目请求封装;axios封装使用
  5. ES6学习--Javascript中的那三个点(...)
  6. Gitorious基本配置流程
  7. 计算机主机名在哪里看win7,大师教您win7系统查看win7系统电脑主机名的图文步骤...
  8. 华为交换机debug icmp数据包
  9. 1#组合数学初步——排列与组合之加法原理、乘法原理
  10. HLW8032做220V电量采集方案测试
  11. 《给QTreeView表项添加CheckBox和图标》:系列教程之七
  12. video.js的使用,打造自定义视频播放器(综合详解,可收藏)
  13. ERP软件信息化实施步骤
  14. iphone 越狱需要安装的包
  15. window VNC Viewer设置屏幕分配率
  16. 每时每刻做最有效的seo操作
  17. c语言字符统计2sdut,山东理工大学SDUT - ACM OJ 题: Python代码 及分析
  18. 剑灵万事屋服务器维护,《阴阳师》手游4月22日维护更新公告
  19. 【推荐热门主题:魔兽世界高清桌面壁纸】
  20. 输出杨辉三角的前N行

热门文章

  1. 在python中可以用什么关键字来声明一个类_3. Python基础语法
  2. mysql search yum_mysql安装-yum方式
  3. python pop check mail_python初学者,用python3实现基本的学生管理系统代码实例
  4. 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)
  5. 修改浏览器下拉条颜色和粗细
  6. java 对象的解释过程
  7. 简单的实现登录拦截及统一异常处理(自定义异常)
  8. redis学习——数据类型
  9. MFC VC 双缓冲绘图基本原理与实现,详细解释
  10. 华为融合电信云解决方案包括_运营商这“一朵云”怎么建?使能者华为的解决之道...