这种题我一直喜欢用bfs搞的,但是这个题不太好bfs,主要是我刚开始想的是通过边进行状态转移,这样很不好写。。。于是就坑爹了,调了很久sample都没出。。。

于是学习了一下别人的思想。。。通过“目的”来进行状态转移而不是边。当你在某个点的时候,你可以为了游历某个景点去某个点,也可以为了获取某个点的票而去某个点。能想到这一点的话状态转移方程就很好写了,但是也要能想到啊。。。

ps:注意代码中的(1) 跟(2)的关系。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<cstdio>
#include<bitset>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define debug puts("**debug**")
#define LL long long
#define PB push_back
#define MP make_pair
#define eps 1e-8
using namespace std;const int maxn = 55;
const int INF = 1e9;
int T, n, m, k, tot, u, v, w, ni;
int dp[1<<8][1<<8][maxn], g[maxn][maxn], p[10], t[10], ft[10];
LL in[10]; //in[i]:第i个景点的票在那些点能拿到inline int bit(int x) { return 1<<x; }
inline void CheckMin(int &a, int b) { if(a == -1 || a > b) a = b; }
//x点能拿到那些景点的票
inline int has(int x)
{int ret = 0;REP(i, k) if(in[i]&(1LL<<x)) ret |= 1<<i;return ret;
}void pre()
{scanf("%d%d%d", &n, &m, &k);CLR(g, -1); CLR(in, 0);REP(i, m){scanf("%d%d%d", &u, &v, &w);CheckMin(g[u][v], w);g[v][u] = g[u][v];}REP(i, k){scanf("%d%d%d%d", &p[i], &t[i], &ft[i], &ni);while(ni--){scanf("%d", &u);in[i] |= 1LL<<u;}}
}void floyd()
{FF(k, 1, n+1)FF(i, 1, n+1) if(i != k && g[i][k] != -1)FF(j, 1, n+1) if(k != j && g[k][j] != -1){if(i == j) g[i][j] = 0;else CheckMin(g[i][j], g[i][k] + g[k][j]);}
}int solve()
{//dp[vis][have][i]://已经游历过vis状态的点,拥有have状态的票 目前在i城市的最小耗时CLR(dp, -1);dp[0][0][1] = 0;tot = 1<<k;REP(vis, tot)   REP(have, tot) if((vis&have) == vis) //vis是have的真子集......(1)FF(i, 1, n+1) if(dp[vis][have][i] != -1){REP(j, k) if((vis & bit(j)) == 0)//未游离j景点{//去游历j景点 获得该点的所有票//游历j景点不一定需要票 但游历后默认为有j票  ......(2)int sta = has(p[j]);CheckMin(dp[vis|bit(j)][have|sta|bit(j)][p[j]], dp[vis][have][i] + g[i][p[j]] + (((have|sta)&bit(j)) ? ft[j] : t[j]));}FF(j, 1, n+1){//去某点获得该点的所有票int sta = has(j);if(sta == have) continue;if((sta&have) != sta)CheckMin(dp[vis][have|sta][j], dp[vis][have][i] + g[i][j]);}}int ret = INF;REP(have, tot) FF(i, 1, n+1) if(dp[tot-1][have][i] != -1)CheckMin(ret, dp[tot-1][have][i] + g[i][1]);return ret;
}int main()
{scanf("%d", &T);FF(kase, 1, T+1){pre();floyd();printf("Case #%d: %d\n", kase, solve());}return 0;
}

hdu Disney's FastPass(状态压缩dp)相关推荐

  1. HDU 4997 Biconnected (状态压缩DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4997 题意:一个n个点的完全图中去掉一些边.求这个图有多少个子图是边双联通的.(就是去掉任意一条边之后 ...

  2. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  3. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

  4. Victor and World(spfa+状态压缩dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/ ...

  5. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  6. 状态压缩dp学习小记part2

    继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...

  7. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  8. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  9. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  10. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

最新文章

  1. Mysql不需要身份验证便可远程连接故障
  2. BlockChain:《Blockchain Gate》听课笔记——以POW机制为例阐述共识机制的激励相容设计
  3. ubuntu11.10+git+svn works
  4. Redis 是属于多线程还是单线程?
  5. 链表之单链表约瑟夫问题(二)
  6. windows8.1下使用U盘安装Ubuntu双系统
  7. JS中的Map和Set实现映射对象
  8. 【NOIP2012】【Luogu1075】质因数分解(模拟)
  9. win10环境下MinGW和MSYS的安装与配置
  10. Setup Factory安装及程序安装包制作教程
  11. c语言dt2文件,JETSON NANO 2G使用笔记2-查看配置信息 第一个C程序 配置VNC 文件管理SCP...
  12. Generative Image Inpainting with Contextual Attention(CVPR2018)
  13. 基于R语言的模型组合
  14. centos解压分卷rar_linux命令:tar分卷压缩与合并解压缩
  15. 使用不同的命令去打包正式,测试,本地vue项目
  16. 简单python脚本实例画图-Python使用matplotlib简单绘图示例
  17. java表示一个数的二进制数,怎么表示一个二进制数?
  18. 十年时光 离开的谷歌给中国互联网界留下了这些人
  19. 清华快速充电_什么是快速充电
  20. 图像处理-离散傅里叶变换-数字图像处理第三版第四章内容

热门文章

  1. 黑苹果OC配置工具:OpenCore Configurator for Mac(2.48.0.0中文)
  2. 苹果手机用计算机打不开怎么回事啊,苹果手机商店打不开怎么办
  3. GitLab使用手册
  4. 小学计算机室行事周历,关于小学信息技术教案八篇
  5. Thingsboard 时序数据和属性数据
  6. Fast Affine Template Matching over Galois Field仿射模板匹配数据测试问题
  7. python自制简易二维码代码_用python把自己的二维码制作成动态码,一行代码即可搞定!敲简单!...
  8. 分别用if else 以及 switch实现 税收计算
  9. Ubuntu KVM安装过程
  10. Go语言经典库使用分析(六)| Negroni 中间件(二)