bfs+状态压缩求出所有的状态,然后由于第一个节点需要特殊处理,可以右移一位剔除掉,也可以特判。然后采用集合的操作,

  1. #pragma comment(linker,"/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <queue>
  4. using namespace std;
  5. #define inf 0x3f3f3f3f
  6.  
  7. int n, m, cnt;
  8. int head[17], next[17 * 17 * 2 + 3][3], dp[1 << 17][17], dis[1 << 17], num[1 << 17];
  9.  
  10. void add (int u, int v, int w)
  11. {
  12. next[cnt][1] = v;
  13. next[cnt][2] = w;
  14. next[cnt][0] = head[u];
  15. head[u] = cnt++;
  16. }
  17.  
  18. void bfs ()
  19. {
  20. queue<pair<int, int> > q;
  21. q.push(make_pair(0, 1));
  22. dp[1][0] = 0;
  23. while (!q.empty()){
  24. pair<int, int> p = q.front();
  25. q.pop();
  26. int su = p.second;
  27. int u = p.first;
  28. for (int i = head[u]; i != -1; i = next[i][0]){
  29. int v = next[i][1];
  30. int w = next[i][2];
  31. int sv = su|(1 << v);
  32. if(dp[sv][v] > dp[su][u] + w){
  33. dp[sv][v] = dp[su][u] + w;
  34. q.push(make_pair(v, sv));
  35. }
  36. }
  37. }
  38. }
  39.  
  40. int main ()
  41. {
  42. //freopen ("in.txt", "r", stdin);
  43. int t, count = 0;
  44. scanf ("%d", &t);
  45. while (t--)
  46. {
  47. scanf ("%d %d", &n, &m);
  48. int u, v, w;
  49. for (int i = 0; i < n; ++i) head[i] = -1;
  50. for (int i = (1 << n) - 1; i >= 0; --i){
  51. dis[i] = inf;
  52. num[i] = inf;
  53. for (int j = 0; j < n; ++j) dp[i][j] = inf;
  54. }
  55. cnt = 0;
  56. for (int i = 0; i < m; ++i){
  57. scanf ("%d %d %d", &u, &v, &w);
  58. add (u - 1, v - 1, w);
  59. add (v - 1, u - 1, w);
  60. }
  61. scanf ("%d", &m);
  62. v = 0;
  63. for (int i = 0; i < m; ++i){
  64. scanf ("%d", &u);
  65. v |= (1 << (u - 1));
  66. }
  67. v >>= 1;
  68. if (!m || (m == 1 && u == 1)){
  69. printf("Case %d: 0\n", ++count);
  70. continue;
  71. }
  72. bfs ();
  73. u = inf;
  74. w = (1 << (n-1)) - 1;
  75. for(int i = 1; i < (1 << n); ++i)
  76. for(int j = 0; j < n; ++j)
  77. dis[i >> 1] = min(dis[i >> 1], dp[i][j]);
  78. for (int i = 1; i <= w; ++i)
  79. for (int j = i; j; j = (j - 1) & i)
  80. num[i] = min(num[i], max(dis[j], dis[i ^ j]));
  81. for (int i = 1; i <= w; ++i)
  82. for(int j = i; j; j = (j - 1) & i)
  83. if((i & v) == v) u = min(u, max(num[j], dis[i ^ j]));
  84. if (u == inf) u = -1;
  85. printf("Case %d: %d\n", ++count, u);
  86. }
  87. return 0;
  88. }

hdu 4640 Island and study-sister的更多相关文章

  1. hdu 4640 Island and study-sister(状态压缩dp)

    先处理前两个学长到达各个点所需要的最少时间,在计算前两个学长和最后一个学长救出所有学妹的最少时间. #include<stdio.h> #include<string.h> # ...

  2. HDU 4280 Island Transport(网络流,最大流)

    HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islan ...

  3. hdu 4640(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 思路:f[i][j]表示一个人状态i下走到j的最小花费,dp[i][j]表示i个人在状态j下的最 ...

  4. HDU 4280 Island Transport(网络流)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=4280">http://acm.hdu.edu.cn/showproblem.php ...

  5. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  6. HDU 4280 Island Transport

    Island Transport Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. Origi ...

  7. Hdu 4280 Island Transport(最大流)

    Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  8. HDU 4280 Island Transport(无向图最大流)

    HDU 4280:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意: 比较裸的最大流题目,就是这是个无向图,并且比较卡时间. 思路: 是这样的,由于是 ...

  9. HDU 4280 Island Transport(dinic+当前弧优化)

    Island Transport Description In the vast waters far far away, there are many islands. People are liv ...

随机推荐

  1. c++11 : Local and Unnamed Types as Template Arguments

    In N2402, Anthony Williams proposes that local types, and unnamed types be usable as template argume ...

  2. DC综合环境的一些概念

    DC综合环境的一些概念 启动文件 .synopsys_dc_setup 采用Tcl格式,包含工艺库的路径信息和其他环境变量 不同位置启动顺序 1.Synopsys安装目录 2.用户家目录 3.项目工作 ...

  3. CSS3新特性(阴影、动画、渐变、变形、伪元素等) CSS3与页面布局学习总结——CSS3新特性(阴影、动画、渐变、变形、伪元素等)

      目录 一.阴影 1.1.文字阴影 1.2.盒子阴影 二.背景 2.1.背景图像尺寸 2.2.背景图像显示的原点 三.伪元素 3.1.before 3.2.after 3.3.清除浮动 四.圆角与边 ...

  4. 初探CSS

    css基本框架 index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  5. RecycleView 瀑布流滑动移位

    RecycleView StaggeredLayoutManager(瀑布流)滑动的时候,默认会出现item移动的问题,需以下来个步骤来解决: 附上StaggeredLayoutManager中的一段 ...

  6. Cordova自定义插件

    项目原因需要自定义Cordova插件,下面把实现过程记录以便将来查阅.工程为Eclipse下的Android工程,该工程已经引入Cordova.Cordova版本4.0.2.1.定义插件类OpenAp ...

  7. include,include_once,require,require_once的区别

    1.include,require在其被调用的位置处包含一个文件. 2.include_once,require_once函数的作用与include相同,不过它会首先验证是否已包含该文件.如果已经包含 ...

  8. Backbone的RESTFUL API 解释

    RESTFUL API 从服务器获取模型:collection.fetch();//发送GET请求 地址为collection.url; 存取模型至服务器: model.save();//发送PUT请 ...

  9. jquery1.9学习笔记 之选择器(基本元素五)

    多种元素选择器  jQuery("selector1,selector2,selectorN") 例子: <!doctype html> <html lang=' ...

  10. python比较两个列表

    两个列表,随机产生4个不相等的数,计算一下,相同位置上的元素相等的个数,用k1表示. b列表中的元素在a列表中,但位置不相同,有多少个,用k2表示. 例如: a=[0, 4, 7, 3]b=[7, 1 ...