题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114

思路:首先是floyd预处理出任意两点之间的最短距离。dp[state1][state2][u]表示在该状态state1(已经访问过的景点)、state2(手中有的景点的票)、目前所在的位置时所花费的时间的最小值,于是答案就是dp[(1<<k)-1][state][1]了(0<=state<(1<<n))。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<vector>
  7. using namespace std;
  8. #define inf 1<<30
  9. #define FILL(a,b) memset(a,b,sizeof(a))
  10.  
  11. int dp[<<][<<][];//访问过的+收集的票+当前顶点
  12. int pos[],time[],f_time[],map[][];
  13. int Mask[];
  14. int n,m,k,ans;
  15.  
  16. void floyd()
  17. {
  18. for(int k=; k<=n; k++)
  19. for(int i=; i<=n; i++)
  20. for(int j=; j<=n; j++)
  21. if(map[i][k]!=inf&&map[k][j]!=inf&&map[i][k]+map[k][j]<map[i][j])
  22. map[i][j]=map[i][k]+map[k][j];
  23. }
  24.  
  25. void Get_Dp()
  26. {
  27. for(int i=; i<=(<<k); i++)
  28. for(int j=; j<=(<<k); j++)
  29. for(int u=; u<=n; u++)dp[i][j][u]=inf;
  30. dp[][][]=;
  31. for(int state1=; state1<(<<k); state1++) {
  32. for(int state2=; state2<(<<k); state2++) {
  33. for(int u=; u<=n; u++)if(dp[state1][state2][u]<inf) {
  34. for(int i=; i<k; i++)if(!(state1&(<<i))) {
  35. int cost=map[u][pos[i]];
  36. if(state2&(<<i))cost+=f_time[i];
  37. else cost+=time[i];
  38. dp[state1|(<<i)][state2|Mask[pos[i]]][pos[i]]=min(dp[state1|(<<i)][state2|Mask[pos[i]]][pos[i]],dp[state1][state2][u]+cost);
  39. }
  40. for(int v=; v<=n; v++) {
  41. dp[state1][state2|Mask[v]][v]=min(dp[state1][state2|Mask[v]][v],dp[state1][state2][u]+map[u][v]);
  42. }
  43. }
  44. }
  45. }
  46. ans=inf;
  47. for(int state=;state<(<<k);state++){
  48. ans=min(ans,dp[(<<k)-][state][]);
  49. }
  50. }
  51.  
  52. int main()
  53. {
  54. int _case,u,v,w,num,t=;
  55. scanf("%d",&_case);
  56. while(_case--) {
  57. scanf("%d%d%d",&n,&m,&k);
  58. for(int i=; i<=n; i++)
  59. for(int j=; j<=n; j++)map[i][j]=(i==j?:inf);
  60. while(m--) {
  61. scanf("%d%d%d",&u,&v,&w);
  62. map[u][v]=map[v][u]=min(map[u][v],w);
  63. }
  64. FILL(Mask,);
  65. for(int i=; i<k; i++) {
  66. scanf("%d%d%d%d",&pos[i],&time[i],&f_time[i],&num);
  67. while(num--) {
  68. scanf("%d",&v);
  69. Mask[v]|=(<<i);
  70. }
  71. }
  72. floyd();
  73. Get_Dp();
  74. printf("Case #%d: %d\n",t++,ans);
  75. }
  76. return ;
  77. }

hdu 4114(状压dp)的更多相关文章

  1. HDU 4778 状压DP

    一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...

  2. HDU 3001 状压DP

    有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路  成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...

  3. hdu 2809(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...

  4. hdu 2167(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...

  5. Engineer Assignment HDU - 6006 状压dp

    http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...

  6. hdu 3254 (状压DP) Corn Fields

    poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...

  7. HDU 5823 (状压dp)

    Problem color II 题目大意 定义一个无向图的价值为给每个节点染色使得每条边连接的两个节点颜色不同的最少颜色数. 对于给定的一张由n个点组成的无向图,求该图的2^n-1张非空子图的价值. ...

  8. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

  9. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

  10. HDU 4284 状压dp+spfa

    题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...

随机推荐

  1. wxPython中文教程入门实例

    这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下     wxPython中文教程入门实例 wx.Window 是一个基类 ...

  2. WPF三大模板简介

    WPF支持以下类型的模板: (1) 控件模板.控件模板可以将自定义模板应用到某一特定类型的所有控件,或是控件的某一实例.决定控件外观的是ControlTemplate,它决定了控件“长成什么样子”,因 ...

  3. Java for LeetCode 213 House Robber II

    Note: This is an extension of House Robber. After robbing those houses on that street, the thief has ...

  4. SQL Server 2008登录错误:无法连接到(local)的解决方法

    1.服务器类型我们选择了“数据库引擎”时,查找里面的可登录用户名是没有的,下边的服务器名称只显示为“(local)”,连“Windows 身份验证”都无法登录. 如果朋友们和我出错的问题是一样请看下面 ...

  5. 解决VM虚拟机MAC OS X 10.10.x的卡顿问题

    点此链接下载beamoff安装到虚拟机即可.

  6. ASM:《X86汇编语言-从实模式到保护模式》5-7章:汇编基础

    第5-7章感觉是这一本书中比较奇怪的章节,可能是作者考虑到读者人群水平的差异,故意由浅入深地讲如何在屏幕上显示字符和使用mov,jmp指令等等,但是这样讲的东西有点重复,而且看了第六,第七章以后,感觉 ...

  7. DP:教授逻辑学问题

    http://www.zhihu.com/question/23999095#answer-12373156问题来自知乎 2015-08-17 问题描述: 一个教授逻辑学的教授,有三个学生,而且三个学 ...

  8. 基于SSH2的OA项目1.0_20161206_需求分析与框架搭建

    1. SSH项目 OA项目,办公自动化,将公司的数据,文档,流程实现在系统中的管理. 降低人员交流过程中的成本.提高办公的效率. 2 .系统管理 主要实现系统权限的管理,不同的用户登陆后看到菜单项不一 ...

  9. UbuntuLinux安装Mysql

    1.安装Mysql5.7 方法:手动安装5.7 One:     $ wget http://dev.mysql.com/get/mysql-apt-config_0.6.0-1_all.deb 下载 ...

  10. Mysql游标

    14.6.6.1 Cursor CLOSE Syntax 14.6.6.2 Cursor DECLARE Syntax 14.6.6.3 Cursor FETCH Syntax 14.6.6.4 Cu ...