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#。1 数据类型,常量变量,类型转换

    C#. 一.数据类型 1,字符串类型(string) .放入一串字符串,需要用""引起来. 列如: string a ="999"; 2,整型 (int).   ...

  2. PagerSlidingTabStrip的使用

    布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  3. grunt之入门实践

    grunt 是基于nodejs的前端项目管理工具,凭借着大量优秀的插件从众多前端项目管理工具中脱颖而出. 确保先安装了nodejs 为了方便使用Grunt,应该在全局范围内安装Grunt的命令行接口( ...

  4. mysql中取系统当前时间

    <select id="getFreightEfclInventoryList" parameterType="long" resultMap=" ...

  5. 完全不借助VS,编写C#控制台应用程序

    (因为这个必须要借助控制台,所以必须是控制台应用程序) csc.exe是微软.NET Framework 中的C#编译器 步骤如下: 1)用记事本写一个控制台应用程序的代码,保存在E盘,test.cs ...

  6. 01.Editplus+Lua配置

    学习一门语言有一款简单顺手的编辑工具很重要,我使用Editplus要多一点:就想能不能加上Lua支持,网上一搜还还不少.现把配置记录下来,也算做个笔记吧! Editplus版本是中文3.41(网上下吧 ...

  7. Animation 案例解释

    Animation 案例解释: ------------摘自W3c 过度动画类型: linear:线性过渡.等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0) ease:平滑过渡.等同于贝塞尔曲 ...

  8. jsonp跨域请求学习笔记

    前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可以使用ajax实现前端的优化.( ...

  9. html meta标签属性用法集合

    1.<meta name="generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等: 2 ...

  10. Java学习笔记--NIO

    参考资料:http://ifeve.com/buffers/ BIO/NIO/AIO的区别联系 http://stevex.blog.51cto.com/4300375/1284437http://w ...