题目来源:Light OJ 1316 1316 - A Wedding Party

题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路

思路:首先预处理每两点之前的最短路 然后仅仅考虑那些商店 个数小于15嘛 就是TSP问题 状态压缩DP搞一下 状态压缩姿势不正确 有必要加强

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <queue>
  4. #include <vector>
  5. #include <cstring>
  6. using namespace std;
  7. const int maxn = 510;
  8. const int maxm = 16;
  9. const int INF = 999999999;
  10. struct edge
  11. {
  12. int u, v, w;
  13. edge(){}
  14. edge(int u, int v, int w): u(u), v(v), w(w) {}
  15. };
  16.  
  17. struct HeapNode
  18. {
  19. int u, dis;
  20. HeapNode(){};
  21. HeapNode(int u, int dis): u(u), dis(dis){};
  22. bool operator < (const HeapNode& rhs)const
  23. {
  24. return dis > rhs.dis;
  25. }
  26. };
  27. vector <edge> G[maxn];
  28. int d[maxn][maxn];
  29. int dp[1<<maxm][maxm];
  30. bool vis[maxn];
  31. int n, m, t;
  32. int a[maxm];
  33. void Dijkstra(int s)
  34. {
  35. for(int i = 0; i <= n; i++)
  36. d[s][i] = INF;
  37. d[s][s] = 0;
  38. memset(vis, false, sizeof(vis));
  39. priority_queue <HeapNode> Q;
  40. Q.push(HeapNode(s, 0));
  41. while(!Q.empty())
  42. {
  43. HeapNode x = Q.top();
  44. Q.pop();
  45. int u = x.u;
  46. if(vis[u])
  47. continue;
  48. vis[u] = true;
  49. for(int i = 0; i < G[u].size(); i++)
  50. {
  51. edge e = G[u][i];
  52. int v = e.v;
  53. if(d[s][v] > x.dis + e.w)
  54. {
  55. d[s][v] = x.dis + e.w;
  56. Q.push(HeapNode(v, d[s][v]));
  57. }
  58. }
  59. }
  60. }
  61. int get(int x)
  62. {
  63. int ans = 0;
  64. while(x)
  65. {
  66. if(x&1)
  67. ans++;
  68. x >>= 1;
  69. }
  70. return ans;
  71. }
  72. int main()
  73. {
  74. int T;
  75. int cas = 0;
  76. scanf("%d", &T);
  77. while(T--)
  78. {
  79. scanf("%d %d %d", &n, &m, &t);
  80. for(int i = 0; i <= n; i++)
  81. G[i].clear();
  82. for(int i = 0; i < t; i++)
  83. {
  84. int x;
  85. scanf("%d", &x);
  86. a[i] = x;
  87. }
  88. for(int i = 0; i < m; i++)
  89. {
  90. int u, v, w;
  91. scanf("%d %d %d", &u, &v, &w);
  92. G[u].push_back(edge(u, v, w));
  93. }
  94. for(int i = 0; i < n; i++)
  95. Dijkstra(i);
  96. for(int s = 0; s < (1<<t); s++)
  97. {
  98. for(int i = 0; i < t; i++)
  99. {
  100. dp[s][i] = INF;
  101. if(!(s&(1<<i)))
  102. continue;
  103. if(s == (1<<i))
  104. {
  105. //if(s == 2 && i == 1)
  106. // printf("%d\n", d[0][a[i]]);
  107. dp[s][i] = d[0][a[i]];
  108. continue;
  109. }
  110. for(int j = 0; j < t; j++)
  111. {
  112. if((s&(1<<j)) && (i != j))
  113. {
  114. if(dp[s^(1<<i)][j] == INF)
  115. continue;
  116. if(d[a[j]][a[i]] == INF)
  117. continue;
  118. //if(s == 3 && i == 0)
  119. // printf("%d %d %d %d\n", dp[s^(1<<i)][j], d[a[j]][a[i]], j, dp[2][1]);
  120. dp[s][i] = min(dp[s^(1<<i)][j] + d[a[j]][a[i]], dp[s][i]);
  121. }
  122. }
  123.  
  124. }
  125. }
  126. //printf("222*%d\n", dp[3][0]);
  127. int x;
  128. int ans = INF, sum = 0;
  129. for(int s = 1; s < (1<<t); s++)
  130. {
  131.  
  132. for(int i = 0; i < t; i++)
  133. {
  134. //if(s == (1<<i))
  135. // printf("***%d %d %d\n", dp[s][i], i, s);
  136. //printf("**%d %d %d %d\n", dp[s][i], s, i, dp[2][i]);
  137. if(dp[s][i] == INF || d[a[i]][n-1] == INF)
  138. continue;
  139. int temp = get(s);
  140. if(sum < temp || sum == temp && ans > dp[s][i]+d[a[i]][n-1])
  141. {
  142.  
  143. sum = temp;
  144. ans = dp[s][i]+d[a[i]][n-1];
  145. x = s;
  146. }
  147. }
  148. }
  149. if(sum == 0)
  150. {
  151. printf("Case %d: Impossible\n", ++cas);
  152. continue;
  153. }
  154. printf("Case %d: %d %d\n", ++cas, sum, ans);
  155. }
  156. return 0;
  157. }

Light OJ 1316 A Wedding Party 最短路+状态压缩DP的更多相关文章

  1. 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...

  2. Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖

    题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...

  3. POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)

    题意:类似于TSP问题,只是每个点可以走多次,求回到起点的最短距离(起点为点0). 分析:状态压缩,先预处理各点之间的最短路,然后sum[i][buff]表示在i点,状态为buff时所耗时...... ...

  4. 2010辽宁省赛E(Bellman_Ford最短路,状态压缩DP【三进制】)

    #include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;struct node{    int v,z,d, ...

  5. HDU Victor and World (最短路+状态压缩)

    题目链接:传送门 题意: n个城市m条路.刚開始在点1,求把每一个城市都遍历一边最后回到1的花费的最小值. 分析: ​​+n​2​​∗2​n​​). 转自Bestcode. 以下说说我的状态转移,首先 ...

  6. Light oj 1099 - Not the Best 次短路

    题目大意:求次短路. 题目思路:由于可能存在重边的情况所以不能采用邻接矩阵储存图,我用了邻接表来存图. 由起点S到终点E的次短路可能由以下情况组成: 1.S到v点的次短路 + v到E的距离 2.S到v ...

  7. Light OJ 1037 - Agent 47(预处理状态压缩DP)

    题目大意: 有个特工要执行任务,他会遭遇到最多15个目标,特工必须把他们全部杀死.当他杀死一个目标后他可以使用目标的武器来杀死其他人.因此他必须有一个杀人的顺序,使得他开枪的次数最小. 现在给你一个表 ...

  8. Light OJ 1021 - Painful Bases(状态压缩DP)

    题目大意: 给你一个base 进制的数字,把这个数字的每一位进行全排列,问有多少个数字是可以整除k的. 题目解析: #include<cstdio> #include<cstring ...

  9. light oj 1151 - Snakes and Ladders 高斯消元+概率DP

    思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...

随机推荐

  1. Nginx搭建反向代理服务器过程详解(转)

    一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...

  2. nginx 提供静态内容

    Serving Static Content 提供静态内容 原文地址:http://nginx.com/resources/admin-guide/serving-static-content/ Th ...

  3. zoj-3795-Grouping-tarjan确定最长的公路收缩

    使用tarjan缩合点. 然后,dfs寻找最长的公路. 水体. . . #include<stdio.h> #include<string.h> #include<alg ...

  4. php用空格代替标点符号

    php作为常规赛的符号替换为空格 <? php $character = "!@#$%^&*于'纸'纸'文().,<>|[]'\":;}{-_+=? /a ...

  5. 一键安装 gitlab7 on rhel6.4 并设置邮件发送

    一键安装 gitlab7 on rhel6.4 并设置邮件发送 世间本无事,庸人自扰之.书归正传,简短节说:gitlab是个好东西,可是安装手冊奇烂.尽管以前对比文档一步一步安装起来gitlab 6. ...

  6. 有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)

    引用 前几天在网上看到一个淘宝的面试题:有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果.一:分析题目 从题中可以看到“很大的List”以及“ ...

  7. (大数据工程师学习路径)第四步 SQL基础课程----其他(基础练习到此为止)

    一.准备 在正式开始本内容之前,需要先从github下载相关代码,搭建好一个名为mysql_shiyan的数据库(有三张表:department,employee,project),并向其中插入数据. ...

  8. UOJ #5. 【NOI2014】动物园 扩大KMP

    第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比 ...

  9. 于 jsp第横梁list数据

            往往我们都会将查询到的数据显示到界面中,那么该怎样在界面显示.请看以下的具体解释:     0)前提得在jsp页面中获取后台传过来的数据(在此为List集合):             ...

  10. Oracle 修改字符集

    出现ORA-12899,是字符集引起的,中文在UTF-8中占3个字节,ZHS16GBK中占2个字节,而源dmp文件字符集是ZHS16GBK库里倒出来的数据,现在要导入到目标字符集为UTF-8的库里,所 ...