时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:1538

解决:760

题目描述:

In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to form a picture of the Liberty Bell. Alas, one of the freckles turns out to be a scar, so his Ripley's engagement falls through. 

    Consider Dick's back to be a plane with freckles at various (x,y) locations. Your job is to tell Richie how to connect the dots so as to minimize the amount of ink used. Richie connects the dots by drawing straight lines between pairs, possibly lifting
the pen between lines. When Richie is done there must be a sequence of connected lines from any freckle to any other freckle.

输入:

The first line contains 0 < n <= 100, the number of freckles on Dick's back. For each freckle, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the freckle.

输出:

Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the freckles.

样例输入:
  1. 3
  2. 1.0 1.0
  3. 2.0 2.0
  4. 2.0 4.0
样例输出:
  1. 3.41
来源:
2009年北京大学计算机研究生机试真题

思路:

求最小生成树,其中的总路径长度即答案。

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define N 100
  6. #define M (N*(N-1)/2)
  7.  
  8. typedef struct point {
  9. double x;
  10. double y;
  11. } POINT;
  12.  
  13. typedef struct node {
  14. int x;
  15. int y;
  16. double d;
  17. } ROAD;
  18.  
  19. int n;
  20. int pre[N+1];
  21. int count[N+1];
  22. int num;
  23.  
  24. void init()
  25. {
  26. for (int i=1; i<=n; i++)
  27. {
  28. pre[i] = i;
  29. count[i] = 1;
  30. }
  31. num = n;
  32. }
  33.  
  34. int find(int i)
  35. {
  36. while (i != pre[i])
  37. i = pre[i];
  38. return i;
  39. }
  40.  
  41. int combine(int i, int j)
  42. {
  43. int a = find(i);
  44. int b = find(j);
  45. if (a != b)
  46. {
  47. if (count[a] > count[b])
  48. {
  49. pre[b] = a;
  50. count[a] += count[b];
  51. count[b] = 0;
  52. }
  53. else
  54. {
  55. pre[a] = b;
  56. count[b] += count[a];
  57. count[a] = 0;
  58. }
  59. num --;
  60. return 1;
  61. }
  62. else
  63. return 0;
  64. }
  65.  
  66. int cmp(const void *a, const void *b)
  67. {
  68. ROAD *x = (ROAD *)a;
  69. ROAD *y = (ROAD *)b;
  70. return (x->d > y->d) ? 1 : -1;
  71. }
  72.  
  73. int main(void)
  74. {
  75. int m, i, j;
  76. POINT p[N+1];
  77. ROAD r[M];
  78. double sum;
  79.  
  80. while (scanf("%d", &n) != EOF && n)
  81. {
  82. for (i=1; i<=n; i++)
  83. scanf("%lf%lf", &p[i].x, &p[i].y);
  84.  
  85. m = 0;
  86. for (i=1; i<=n; i++)
  87. {
  88. for (j=i+1; j<=n; j++)
  89. {
  90. r[m].x = i;
  91. r[m].y = j;
  92. r[m].d = sqrt( (p[i].x-p[j].x)*(p[i].x-p[j].x)
  93. + (p[i].y-p[j].y)*(p[i].y-p[j].y) );
  94. m ++;
  95. }
  96. }
  97. qsort(r, m, sizeof(r[0]), cmp);
  98. //for (i=0; i<m; i++)
  99. // printf("%d %d %.2lf\n", r[i].x, r[i].y, r[i].d);
  100.  
  101. init();
  102. sum = 0;
  103. for(i=0; i<m; i++)
  104. {
  105. if(combine(r[i].x, r[i].y))
  106. sum += r[i].d;
  107. if (num == 1)
  108. break;
  109. }
  110.  
  111. printf("%.2lf\n", sum);
  112. }
  113.  
  114. return 0;
  115. }
  116. /**************************************************************
  117. Problem: 1144
  118. User: liangrx06
  119. Language: C
  120. Result: Accepted
  121. Time:10 ms
  122. Memory:932 kb
  123. ****************************************************************/

九度OJ 1144:Freckles(斑点) (最小生成树)的更多相关文章

  1. 【九度OJ】题目1144:Freckles 解题报告

    [九度OJ]题目1144:Freckles 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1144 题目描述: In an ...

  2. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  3. 【九度OJ】题目1028:继续畅通工程 解题报告

    [九度OJ]题目1028:继续畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1028 题目描述: 省政府" ...

  4. 【九度OJ】题目1024:畅通工程 解题报告

    [九度OJ]题目1024:畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅 ...

  5. 【九度OJ】题目1017:还是畅通工程 解题报告

    [九度OJ]题目1017:还是畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1017 题目描述: 某省调查乡村交通 ...

  6. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  7. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  8. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

  9. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

随机推荐

  1. Topcoder SRM 664 DIV 1

    BearPlays 快速幂 题意: 给你两个数A,B,有种操作是将大的数减去小的数,并将小的数乘以2.反复k次,问你最后的小的数回是多少. 题解: 由于整个过程$A+B$的值是不会改变的.现在令$S= ...

  2. 执行 innerHTML 里的 <script>

    原文:执行 innerHTML 里的 <script> 背景 有时候我们会有把一整段 HTML 动态塞进页面的需求,例如渲染了一个模板,从服务器端获取了一段广告代码等.一般情况下我们使用 ...

  3. 【spring boot】12.spring boot对多种不同类型数据库,多数据源配置使用

    2天时间,终于把spring boot下配置连接多种不同类型数据库,配置多数据源实现! ======================================================== ...

  4. linux 学习解决归档管理器打开rar和zip中文文件名乱码问题

    在ubunut下打开windows下压缩的rar文件和zip压缩文件出现中文文件名乱码的问题真的很头疼.文件名乱码其实也没有什么关系是不?至少重命名再改回来或者是使用英文命名都可以克服.不巧的是,如此 ...

  5. 浅谈XXE攻击

    一.XXE,即XML External Entity,XML外部实体.ENTITY 实体,在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的“别名”,即一个ENTITY,然后 ...

  6. 【前端阅读】——《活用PHP、MySQL建构Web世界》摘记之高级应用

    一.高级应用 1.计数器 计数器的原理很简单,只有两步: 第一步就是读写一个数字,第二步就是显示出来.一般CGI'大多直接写到文件系统,当然也可以利用MySQL来存储这个数字,完成第一步的操作. 第二 ...

  7. Linux内核——内存管理

    内存管理 页 内核把物理页作为内存管理的基本单位.内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址)通常以页为单位进行处理.MMU以页大小为单位来管理系统中的页表. 从虚拟内存的角度看,页就是 ...

  8. Async Await 使用

    1.简单例子 var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(func ...

  9. 关于PM的认识

    1 我眼中的PM 1.1 人云“一个管理,半个专家”,我说“一个管理,两个专家” 如今,我发现我们不得不面对这样一个现实——角色兼职.我习惯上把项目分为三类:性命攸关的项目(涉及到人身安全的项目,如铁 ...

  10. 浅谈Generator和Promise原理及实现

    Generator 熟悉ES6语法的同学们肯定对Generator(生成器)函数不陌生,这是一个化异步为同步的利器. 栗子: function* abc() { let count = 0; whil ...