1. #include <stdio.h>
  2. #include <set>
  3. #include <string.h>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int maxn = ;
  8. const int inf = ;
  9. double minans;
  10. int vis[maxn];//记录选中的点
  11. int mp[maxn][maxn], ans[maxn][maxn];
  12. int min_road[maxn];
  13.  
  14. int Prim(int n)
  15. {
  16. int i, j, min_i, minm, sum = ;
  17. int dis[maxn];
  18. int vis[maxn];
  19. for (i = ; i <= n; i++)
  20. dis[i] = ans[i][];
  21. memset(vis, false, sizeof vis);
  22. vis[] = true;
  23. for (i = ; i<n; i++)
  24. {
  25. minm = inf, min_i = i;
  26. for (j = ; j <= n; j++)
  27. {
  28. if (vis[j] == false && dis[j]<minm)
  29. {
  30. minm = dis[j];
  31. min_i = j;
  32. }
  33. }
  34. if (minm == inf)
  35. break;
  36. sum += minm;
  37. vis[min_i] = true;
  38. for (j = ; j <= n; j++)
  39. {
  40. if (vis[j] == && dis[j]>ans[min_i][j])
  41. dis[j] = ans[min_i][j];
  42. }
  43. }
  44. return sum;
  45. }
  46.  
  47. int ok(int n)
  48. {
  49. memset(vis, , sizeof vis);
  50. int cnt = ;
  51. int m = n, cont = ;
  52. while (m)
  53. {
  54. if (m % )
  55. vis[cont++] = cnt;
  56. cnt++;
  57. m /= ;
  58. }
  59. return cont;
  60. }
  61.  
  62. int main()
  63. {
  64. int d[maxn], maxm;
  65. int n, i, j, k, cnt, m;
  66. while (scanf("%d%d", &n, &m) != EOF)
  67. {
  68. if (n == && m == )
  69. break;
  70. maxm = ;
  71. for (i = ; i <= n; i++)
  72. maxm *= ;
  73. for (i = ; i <= n; i++)
  74. scanf("%d", &d[i]);
  75. for (i = ; i <= n; i++)
  76. {
  77. for (j = ; j <= n; j++)
  78. {
  79. scanf("%d", &mp[i][j]);
  80. }
  81. }
  82. minans = 9999999999.0;
  83. int sum_point;
  84. for (i = ; i < maxm; i++)
  85. {
  86. if (ok(i) == m + )
  87. {
  88. sum_point = ;
  89. for (j = ; j <= m; j++)
  90. {
  91. sum_point += d[vis[j]];//选的点
  92. for (k = j + ; k <= m; k++)
  93. {
  94. ans[j][k] = ans[k][j] = mp[vis[j]][vis[k]];
  95. }
  96. }
  97. int sum = Prim(m);
  98. if ((sum*1.0 / sum_point) < minans)
  99. {
  100. minans = sum*1.0 / sum_point;
  101. for (i = ; i <= m; i++)
  102. min_road[i] = vis[i];
  103. }
  104. }
  105. }
  106. for (i = ; i <= m - ; i++)
  107. printf("%d ", min_road[i]);
  108. printf("%d\n", min_road[i]);
  109. }
  110. return ;
  111. }

hdu2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树的更多相关文章

  1. HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)

    Minimal Ratio Tree Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  2. HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)

    想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...

  3. hdu 2489 dfs枚举组合情况+最小生成树

    大家都说,搜索是算法的基础.今天最这题就有体会了.在n个顶点里选择m个顶点,求最小生成树.用到了深搜的回溯.所有情况都能枚举. #include<iostream> #include< ...

  4. hdu2489 Minimal Ratio Tree

    hdu2489 Minimal Ratio Tree 题意:一个 至多  n=15 的 完全图 ,求 含有 m 个节点的树 使 边权和 除 点权和 最小 题解:枚举 m 个 点 ,然后 求 最小生成树 ...

  5. HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】

    Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and ...

  7. HDU 2489 Minimal Ratio Tree 最小生成树+DFS

    Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. HDU 2489 Minimal Ratio Tree(prim+DFS)

    Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. HDU 2489 Minimal Ratio Tree(暴力+最小生成树)(2008 Asia Regional Beijing)

    Description For a tree, which nodes and edges are all weighted, the ratio of it is calculated accord ...

随机推荐

  1. 服务器----1U、2U、3U、4U

    U是一种表示服务器外部尺寸的单位,是unit的缩略语,详细的尺寸由作为业界团体的美国电子工业协会(EIA)所决定. 之所以要规定服务器的尺寸,是为了使服务器保持适当的尺寸以便放在铁质或铝质的机架上.机 ...

  2. v-bind指令

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 正则表达式pattern的匹配格式

    0> 匹配 -------------------------------------------------------------------------------- (pattern)  ...

  4. 通俗易懂EJB

    摘自:http://blog.csdn.net/jojo52013145/article/details/5783677 1. 我们不禁要问,什么是"服务集群"?什么是" ...

  5. Latex 5: LaTeX资料下载

    转: LaTeX资料下载 最全latex资料下载   LaTeX命令速查手册1  

  6. SimpleAdapter ArrayAdapter用法

    listView = (ListView) findViewById(R.id.list_main); /* String[] strings = {"A","A&quo ...

  7. spring cloud config 属性加解密

    首先需要(Java Cryptography Extension (JCE))的支持,下载路径: https://www.oracle.com/technetwork/java/javase/down ...

  8. 默认安装centos7 网卡没有启动的问题

    CentOS最小化安装的时候,先把net-tools安装上(先把网卡配置好再安装.) #yum install net-tools 登录操作系统 用户名root 密码 123456 输入ip查询命令  ...

  9. (linux)mmccard驱动的读写过程解析

      mmc io的读写从mmc_queue_thread()的获取queue里面的request开始. 先列出调用栈,看下大概的调用顺序, 下面的内容主要阐述这些函数如何工作. host->op ...

  10. (C)理解#define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))

      理解 #define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b)) 嵌入式系统编程,要求程序员能够利用C语言访问固 ...