http://acm.hdu.edu.cn/showproblem.php?pid=4114

题意:给定一个带权无向同(<=50)和图中若干个点(<=8),..现在要你‘游’这些点,‘游’过这些点的条件是你在这个点等上了一定的时间,如果你有fastpass,也就是经过某些点,那么只需要等FT的时间,否则要等T的时间,问从1号点出发完成任务再回到1号点的最少时间。

思路,状态压缩dp,f[i][j][mark]表示当前在j这个点,已经‘游’过的点的2进制状态为i,手上有fastpass的2进制为mark的最少时间

则f[i][j][mark] => f[i | (1<<p)][loc[p]][new_mark] // p是下一个要去的点号,loc[p]是他的位置,new_mark是经过loc[p]后新的关于fastpass的2进制状态

同理f[i][j][mark] => f[i][j'][new_mark] // 往另外一个点走,不是最‘游’那些点,可以认为有意图地去是拿fastpass。如果mark==new_mark, 这个式子有没有都不影响结果。

代码:

// hdu4114.Disney's FastPass - dp
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;#define sqr(x) ((x) * (x))
#define two(x) (1 << (x))
#define Rep(i, s, n) for (int i = s; i < (n); ++i)
#define X first
#define Y secondtypedef long long LL;const int MAXN = 55;
const double eps = 1e-9;
const int INF = 1000000000;int n, m, k, ans;
int gra[MAXN][MAXN], f[two(8)][MAXN][two(8)], p[10], t[10], ft[10];
LL  mark[10];void init()
{int tp, pp;scanf("%d%d%d", &n, &m, &k);memset(gra, -1, sizeof(gra));for (int i = 1; i <= m; ++i){int p, q;scanf("%d%d", &p, &q);scanf("%d", &gra[p][q]);gra[q][p] = gra[p][q];}memset(mark, 0, sizeof(mark));for (int i = 0; i < k; ++i){scanf("%d%d%d", &p[i], &t[i], &ft[i]);scanf("%d", &tp);while (tp--){scanf("%d", &pp);mark[i] |= (1LL << pp);}}
}void flody()
{for (int k = 1; k <= n; ++k){for (int i = 1; i <= n; ++i) if (i != k && gra[i][k] >= 0){for (int j = 1; j <= n; ++j) if (j != k && gra[k][j] >= 0){if (i == j) gra[i][j] = 0;else gra[i][j] = (gra[i][j] < 0)? gra[i][k] + gra[k][j]: min(gra[i][j], gra[i][k] + gra[k][j]);}}}
}int links(int p)
{int ret = 0;for (int i = 0; i < k; ++i) if (mark[i] & (1LL << p)) ret += two(i);return ret;
}void checkmin(int &p, int v)
{if (p == -1 || v < p) p = v;
}void work()
{memset(f, -1, sizeof(f));f[0][1][0] = 0;for (int ki = 0; ki < two(k); ++ki){for (int u = 0; u < two(k); ++u) if ((ki & u) == ki)  //。。。。。。。。(1){for (int i = 1; i <= n; ++i) if (f[ki][i][u] >= 0){for (int kj = 0; kj < k; ++kj) if ((two(kj) & ki) == 0){int mask = links(p[kj]);checkmin(f[ki | two(kj)][p[kj]][mask | u | two(kj)], f[ki][i][u] + gra[i][p[kj]] + (((u | mask) & two(kj))? ft[kj]: t[kj]));}for (int j = 1; j <= n; ++j){int mask = links(j);if ((mask & u) != mask)checkmin(f[ki][j][mask | u], f[ki][i][u] + gra[i][j]);}}}}ans = INF;for (int u = 0; u < two(k); ++u){for (int i = 1; i <= n; ++i) if (f[two(k) - 1][i][u] >= 0)ans = min(ans, f[two(k) - 1][i][u] + gra[i][1]);}
}int main()
{int T, ca = 0;scanf("%d", &T);while (T--){init();flody();work();printf("Case #%d: %d\n", ++ca, ans);}return 0;
}

P.S.

a.这是2011成都赛区的水题之一D题……

b.很久没做题了,果然一上来就读错题,理解错两个地方……

c.连题解都不会写了,我觉得我的题目描述和解题思路都是很别扭的……题目看原文吧……题解没办法的就直接看代码咯……

d.原本(1)这个地方没有if判断,时间复杂度是4^k*n^2,7sAC,然后根据网上说用3进制,2表示‘游’过,1表示有fastpass,0表示什么都没,状态表示为f[mark3][n],超时,因为&,|都不能用,手写时间复杂度就换回来了,后来就空间继续用2个2进制,然后加一句(1)处的判断,表示‘游’过的点,如果手上没票就是不合法状态不用管,当然dp转移也要适当的改变,就是‘游’过的点同时让他们手上有这个点的fastpass……最后1.7sAC

e.今天发生了一些事,郁闷了一天,愿逝者安息,生者自强。大家保重身体。

hdu4114.Disney's FastPass相关推荐

  1. hdu 4114 Disney's FastPass 状压dp

    点击打开链接 题意: 游戏园里有N个区域,有M条边连接这N个区域,有K个要访问的景点.对于每个景点告诉你这个景点所在的区域,要访问这个景点需要等待一定时间,如果没有FastPass,等待时间有Ti,否 ...

  2. HDU 4114 Disney's FastPass

    传送门 状压dp+最短路. 一个无向图,接下来给出一些兴趣点,每个兴趣点被访问时有一定耗时.找一条从起点开始访问所有兴趣点再回到起点耗时最短的路(必须访问所有兴趣点,途中可以经过任意点(经过任意点包括 ...

  3. HDU Disney's FastPass

    原创:http://acm.hdu.edu.cn/showproblem.php?pid=4114 题意:从1开始遍历完k个给定点,最终回到1,的最少时间 思路:首先是floyd预处理出任意两点之间的 ...

  4. HDU 4114 Disney's FastPass(状压dp)

    题意就是给你一些点,有的地方有景区,有的地方有某些景点的优先票,拿优先票去景点和不拿的时间不一样.问从地点1出发去所有景点再回来的最短时间. 得把景点,景区进行状压.即dp[i][j][k]代表参观景 ...

  5. hdu Disney's FastPass(状态压缩dp)

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

  6. 【LDU】 Week2自测 Disney‘s FastPass | 状压dp、Floyd

    这题是hdu 4114... 跟着19的打了打周测,发现个好题 写了写还wa了一发 题目大意: 给出n个点,k个要旅游的景点,然后给出k个景点的信息(位置,t,ft,门票所在地点),t于ft表示,如果 ...

  7. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  8. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  9. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

最新文章

  1. laravel ajax vue6,详解用vue.js和laravel实现微信支付
  2. ajax 局部页面替换innerhtml,ajax jquery 页面局部刷新的不同实现代码
  3. 简单的文件上传功能实现(java)
  4. android jdbc 连接mysql数据库,android怎么用JDBC方法连接mysql数据库
  5. Python中的Series和DataFrame
  6. python中set函数是什么数据类型_Python基本数据类型之set
  7. Android 隐藏、显示软键盘方法
  8. Python PIP Mysql-python 报错 ERROR: Command errored out with exit status 1: python setup.py egg_info C
  9. 该怎么压缩ppt大小
  10. java定时任务不执行_【SpringBoot】为什么我的定时任务不执行?
  11. asterisk android代码,Asterisk + Vtiger CRM 5.1 电击拨号 实现来电弹屏
  12. 在VB6中生成随机数
  13. JSP 编译和运行过程与JSP源码简单分析
  14. 《绝地求生》玩家排名预--2.问题分析
  15. docker安装minio:Access key length should be at least 3, and secret key length at least 8 characters
  16. 2019年4月中国编程语言排行榜,java占有率一骑绝尘,python工资领先
  17. 你还在为博客访问量少而发愁么?
  18. Antlr4:使用grun命令,触发NoClassDefFoundError
  19. android 卡片切换 印象笔记,挖掘iPhone版印象笔记的 13 个高效率操作技巧
  20. S2B2C商城系统(分销商城)哪家好?S2B2B商城系统好在哪?

热门文章

  1. 在Python里,用股票案例讲描述性统计分析方法(内容来自我的书)
  2. 朋友,别再干巴巴地“陈述”简历了,10条写作的技巧分享给你
  3. 知乎服务器出现故障:APP出现异常提示
  4. JavaScript将List转Tree
  5. FFmpeg压缩MP4视频命令
  6. python黑色背景rbg_PIL图像转换为RGB,保存为纯黑色图像(python)
  7. 免费最新微信,QQ拦截查询代码接口
  8. java应用 cpu占用过高问题分析及解决方法
  9. 【遇见CUDA】CUDA算法效率提升关键点概述
  10. 变分(Calculus of variations)的概念及运算规则(一)