计蒜客 宝藏 (状压DP)
**链接 : **Here!
**思路 : **
状压DP. 开始想直接爆搜, T掉了, 然后就采用了状压DP的方法来做.
定义$f[S]$为集合$S$的最小代价, $dis[i]$则记录第$i$个点的"深度", 所以说边$E{[i, j]}$ 的工程代价就为$dis[i] * E{[i, j]}$, 因此可以得到状态转移方程 :
初始状态(假设以$i$作为起点) :
- $dis[i] = 1$, $f[1 << (i - 1)] = 0$,
- $dis[k] = INF (k != i, k = 1, 2, 3 ...)$, $f[k] = INF (k != (1 << (i - 1)), k = 1, 2, ... , (1 << n) - 1)$
对于中间状态$j$ :
- $f[S | 1 << (j - 1)] = min(f[S | 1 << (j - 1)], f[S] + E[i][j] * dis[i])$
- $dis[j] = dis[i] + 1$
大犇说, 状压为什么快, 是因为在读取数据的时候比普通数组要快... 所以说, 我还是不太理解...为什么快, QAQ, 大犇还说, 世界上总有这么一群人, 你们俩算法复杂度一样, 但他就是比你快几百倍... em....
代码 :
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX_N 15
const int INF = 0x7FFFFFFF;
int E[MAX_N][MAX_N];
int dis[MAX_N], f[1 << MAX_N];
int n, m;
void init() {
for (int i = 1 ; i <= n ; ++i) {
for (int j = 1 ; j <= n ; ++j) {
E[i][j] = INF;
}
}
}
void read() {
scanf("%d%d", &n, &m);
init();
for (int i = 0 ; i < m ; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
E[u][v] = min(E[u][v], w);
E[v][u] = min(E[v][u], w);
}
}
void find(int S) {
for (int i = 1 ; i <= n ; ++i) {
if (!((1 << (i - 1)) & S)) continue;
for (int j = 1 ; j <= n ; ++j) {
// if (!((1 << (j - 1) & S) == 0 && E[i][j] != INF)) continue;
if (!(!(1 << (j - 1) & S) && E[i][j] != INF)) continue;
if (f[S | (1 << (j - 1))] <= f[S] + dis[i] * E[i][j]) continue;
f[S | (1 << (j - 1))] = f[S] + dis[i] * E[i][j];
int t_dis = dis[j];
dis[j] = dis[i] + 1;
find(S | (1 << (j - 1)));
dis[j] = t_dis;
}
}
}
void solve() {
int ans = INF;
for (int i = 1 ; i <= n ; ++i) {
for (int j = 1 ; j <= n ; ++j) dis[j] = INF;
for (int j = 1 ; j <= (1 << n) - 1 ; ++j) f[j] = INF;
dis[i] = 1;
f[1 << (i - 1)] = 0;
find(1 << (i - 1));
ans = min(ans, f[(1 << n) - 1]);
}
printf("%d\n", ans);
}
int main() {
read();
solve();
return 0;
}
计蒜客 宝藏 (状压DP)的更多相关文章
- 计蒜客 31434 - 广场车神 - [DP+前缀和]
题目链接:https://nanti.jisuanke.com/t/31434 小 D 是一位著名的车手,他热衷于在广场上飙车.每年儿童节过后,小 D 都会在广场上举行一场别样的车技大赛. 小 D 所 ...
- [NOIP2017]宝藏 状压DP
[NOIP2017]宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖 ...
- 牛客比赛-状压dp
链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意 ...
- P3959 宝藏 状压dp
之前写了一份此题关于模拟退火的方法,现在来补充一下状压dp的方法. 其实直接在dfs中状压比较好想,而且实现也很简单,但是网上有人说这种方法是错的...并不知道哪错了,但是就不写了,找了一个正解. 正 ...
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- NOIp2017D2T2(luogu3959) 宝藏 (状压dp)
时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...
- 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$
正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...
- loj2318 「NOIP2017」宝藏[状压DP]
附带其他做法参考:随机化(模拟退火.爬山等等等)配合搜索剪枝食用. 首先题意相当于在图上找一颗生成树并确定根,使得每个点与父亲的连边的权乘以各自深度的总和最小.即$\sum\limits_{i}dep ...
- Luogu 3959 [NOIP2017] 宝藏- 状压dp
题解 真的想不到这题状压的做法...听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ. 不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ ...
随机推荐
- windows 下 logstash 安装启动
最新在研究elastic stack (elk) : logstash 安装,下载最新版本的logstash: 点击打开链接 解压到磁盘根目录下:在logstash>bin 1.目录下创建:l ...
- arm32位固定指令中怎么容纳32位变量
在ARM指令集汇编码中.32位有效马上数是通过______偶数位而间接得到的 A.循环左移 B.循环右移. C.逻辑左移. D.逻辑右移 答案为循环左移.为什么?还有最好解释一下逻辑移动和循环移动的概 ...
- Android自己定义控件之轮播图控件
背景 近期要做一个轮播图的效果.网上看了几篇文章.基本上都能找到实现,效果还挺不错,可是在写的时候感觉每次都要单独去又一次在Activity里写一堆代码.于是自己封装了一下.这里仅仅是做了下封装成一个 ...
- js导出table中的EXCEL总结
导出EXCEL通常是用PHP做,可是项目中,有时候PHP后端project师返回的数据不是我们想要的,作为前端开发project师,把相应的数据编号转换为文字后,展示给用户.可是.需求要把数据同一时候 ...
- Codeforces Round #377 (Div. 2) D. Exams
Codeforces Round #377 (Div. 2) D. Exams 题意:给你n个考试科目编号1~n以及他们所需要的复习时间ai;(复习时间不一定要连续的,可以分开,只要复习够ai天 ...
- 并查集图冲突hdu1272
还是属于并查集的变形 两个点仅仅有一条路径连通 给出的两个点事先都是属于两个集合的 须要给出的着条边构成一个集合 算法复杂度还是挺高的 每一个我都循环了100000次 set2数组没清空 wrong了 ...
- python为在线漫画站点自制非官方API(未完待续)
接下来将记录我一步一步写一个非官方API的过程,由于一些条件的约束,最后的成品可能非常粗暴简陋 如今介绍要准备的全部工具: 系统:ubuntu 14.04 语言:python 2.7 须要自行安装的库 ...
- python基于selenium+cv2+numpy实现登录某大型电商系统
首先贴上我的安装包 一.selenium安装 I.打开pycharm,点击Settings,找到Project Interpreter,点击右边的下拉菜单下的show All...选项 II.点击sh ...
- nyoj--744--蚂蚁的难题(一)
蚂蚁的难题(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 小蚂蚁童鞋最近迷上了位运算,他感觉位运算非常神奇.不过他最近遇到了一个难题: 给定一个区间[a,b],在 ...
- 【Codeforces 258E】 Devu and Flowers
[题目链接] http://codeforces.com/contest/451/problem/E [算法] 容斥原理 [代码] #include<bits/stdc++.h> usin ...