题意:给定完全无向图,求其中m个子节点,要求Sum(edge)/Sum(node)最小。

思路:由于N很小,枚举所有可能的子节点可能情况,然后求MST,memset()在POJ G++里面需要cstring头文件。

  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <cmath>
  5. #include <memory>
  6. #include <algorithm>
  7. #include <cstdio>
  8. #include <cstdlib>
  9. using namespace std;
  10.  
  11. const int MAXN = 100;
  12. const int INF = 1<<30;
  13.  
  14. #define CLR(x,y) memset(x,y,sizeof(x))
  15. #define MIN(m,v) (m)<(v)?(m):(v)
  16. #define MAX(m,v) (m)>(v)?(m):(v)
  17. #define ABS(x) ((x)>0?(x):-(x))
  18. #define rep(i,x,y) for(i=x;i<y;++i)
  19.  
  20. int n,m,k;
  21.  
  22. double ans = 0;
  23.  
  24. int select[MAXN];
  25. int g[MAXN][MAXN];
  26. int val[MAXN];
  27. int visit[MAXN];
  28. double dist[MAXN];
  29. int ind[MAXN];
  30.  
  31. double Prim()
  32. {
  33. int i,j,tmp,mark_i;
  34. int mark_min;
  35. int sum_node = 0;
  36. int sum_edge = 0;
  37.  
  38. for(i = 0; i < n; ++i)
  39. {
  40. dist[i] = INF;
  41. visit[i] = 0;
  42. }
  43.  
  44. for(i = 0; i < n; ++i)
  45. if(select[i]>0)
  46. {
  47. dist[i] = 0;
  48. break;
  49. }
  50.  
  51. int cnt = 0;
  52.  
  53. for(i = 0; i < n; ++i,++cnt)
  54. {
  55. if(cnt>=m) break;
  56.  
  57. mark_min = INF;
  58.  
  59. for(j = 0; j < n; ++j)
  60. {
  61. if(select[j]>0 && !visit[j] && mark_min>dist[j])
  62. {
  63. mark_min = dist[j];
  64. mark_i = j;
  65. }
  66. }
  67.  
  68. visit[mark_i] = 1;
  69.  
  70. sum_edge += dist[mark_i];
  71.  
  72. for( j = 0; j < n; ++j)
  73. {
  74. if(visit[j]==0 && select[j]>0 && dist[j] > g[mark_i][j])
  75. dist[j] = g[mark_i][j];
  76. }
  77. }
  78.  
  79. for( i = 0; i < n; ++i)
  80. if(select[i] > 0 )
  81. sum_node += val[i];
  82.  
  83. return double(sum_edge)/sum_node;
  84.  
  85. }
  86.  
  87. int DFS(int cur, int deep)
  88. {
  89. double res = INF;
  90.  
  91. select[cur] = 1;
  92.  
  93. if(deep < m)
  94. {
  95. for(int i = cur+1; i < n; ++i)
  96. {
  97. DFS(i,deep+1);
  98. }
  99. }
  100.  
  101. if(deep == m)
  102. {
  103. res = Prim();
  104. if(res < ans)
  105. {
  106. ans = res;
  107. for(int i = 0; i < n; ++i)
  108. ind[i] = select[i];
  109.  
  110. }
  111. }
  112.  
  113. select[cur] = 0;
  114.  
  115. return 0;
  116. }
  117.  
  118. int Solve()
  119. {
  120. while(scanf("%d%d",&n,&m)!=EOF)
  121. {
  122. if(n == 0 && m == 0) break;
  123. for(int i = 0 ; i < n; ++i)
  124. scanf("%d",&val[i]);
  125. for(int i = 0; i < n; ++i)
  126. for(int j = 0; j < n; ++j)
  127. {
  128. scanf("%d",&g[i][j]);
  129. }
  130.  
  131. CLR(select,0);
  132. ans = INF;
  133.  
  134. for(int i = 0 ; i < n; ++i)
  135. DFS(i,1);
  136.  
  137. int tag = 0;
  138. for(int i = 0; i < n; ++i)
  139. if(ind[i] > 0)
  140. if(tag == 0)
  141. {
  142. printf("%d",i+1);
  143. tag = 1;
  144. }
  145. else
  146. printf(" %d",i+1);
  147. printf("\n");
  148. }
  149. return 0;
  150. }
  151.  
  152. int main()
  153. {
  154. Solve();
  155.  
  156. return 0;
  157. }

{POJ}{3925}{Minimal Ratio Tree}{最小生成树}的更多相关文章

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

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

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

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

  3. 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 ...

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

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

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

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

  6. hdu2489 Minimal Ratio Tree

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

  7. HDUOJ----2489 Minimal Ratio Tree

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

  8. Minimal Ratio Tree HDU - 2489

    Minimal Ratio Tree HDU - 2489 暴力枚举点,然后跑最小生成树得到这些点时的最小边权之和. 由于枚举的时候本来就是按照字典序的,不需要额外判. 错误原因:要求输出的结尾不能有 ...

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

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

随机推荐

  1. MyBatis学习(一)、MyBatis简介与配置MyBatis+Spring+MySql

    一.MyBatis简介与配置MyBatis+Spring+MySql 1.1MyBatis简介 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的J ...

  2. C# 随机红包算法

    static void Main(string[] args) { ; ; double minAmount = 0.01; Random r = new Random(); ; i < num ...

  3. 测试Javacript里的checkbox是否被选中的status和checked的替换方法

    测试Javacript里的checkbox是否被选中的status和checked的替换方法,checkbox.checked和checkbox.status的功能一样,注意checkbox.stat ...

  4. 如何在Ubuntu下的VirtualBox虚拟机(Windows XP)里挂载/使用U盘 (转载)

    文章来源:http://www.codelast.com/ 在Ubuntu下安装了VirtualBox之后,如果你的虚拟机安装的是Windows XP系统,那么,你会发现,当你插上U盘时,无论你怎么折 ...

  5. jQuery选择器大全

    1. id选择器(指定id元素) 将id="one"的元素背景色设置为黑色.(id选择器返单个元素) $(document).ready(function () { $('#one ...

  6. ActiveX控件打包、签名、嵌入详解

    ActiveX控件打包.签名.嵌入详解 前言 在我们的一个项目中,使用到了大华网络监控摄像头枪机,网络上下载了其ActiveX插件,但是发现其所提供的类库没有打包处理.这就导致我们每次给用户安装的时候 ...

  7. eclipse NoClassDefFoundError错误

    问题描述:eclipse中执行一个java web项目,代码中依赖都是正常的,发布到tomcat中调试就提示NoClassDefFoundError错误, 问题分析:首先确定工程中该类确实存在,因为代 ...

  8. Java导出Word利用freemarker(含图片)

    制作Word模版 建议使用高版本的office做,尽量不要用WPS做,生成xml会出现乱码 编码要统一,推荐UTF-8 建好模板,将模板另存为xml格式,建议原来模板不要删,xml的如果后期打不开,还 ...

  9. 【Python】【学习笔记】持续更新

    调用模块的两种方式: #方式1 from decimal import Decimal Decimal('1.00') #方式2 import decimal decimal.Decimal('1.0 ...

  10. C# 访问https 未能创建 SSL/TLS 安全通道

    C# 访问https请求被中止: 未能创建 SSL/TLS 安全通道(Could not create SSL/TLS secure channel) 一般GetResponse可以直接访问https ...