Freckles - 九度 OJ 1144

题目

时间限制:1 秒 内存限制:128 兆 特殊判题:否
题目描述:
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.
样例输入:
3
1.0 1.0
2.0 2.0
2.0 4.0
样例输出:
3.41
来源:
2009年北京大学计算机研究生机试真题

题目大意为平面上有若干个点,需要用一些线段来将这些点连接起来使任意两个点能够通过一系列的线段相连,给出所有点的坐标,求一种连接方式使所有线段的长度和最小,求该长度和。
若将平面上的点抽象成图上的结点,将结点间直接相邻的线段抽象成连接结点的边,且权值为其长度,那么该类似于几何最优值的问题就被转化到了图论上的最小生成树问题。但在开始求最小生成树前,必须先建立该图, 得出所有的边和相应的权值。

#include <stdio.h>
#include <math.h>
#include <algorithm>
#define N 101using namespace std;int Tree[N];int findRoot(int x){if(Tree[x]==-1)return x;else{int tmp=findRoot(Tree[x]);Tree[x]=tmp;return tmp;}
}struct Edge{int a,b;double cost;//权值变为长度,改用浮点数bool operator < (const Edge &A) const{return cost < A.cost;}
}edge[6000];struct Point{//点结构体double x,y;//点的两个坐标值double getDistance(Point A){//计算点之间的距离double tmp=(x-A.x)*(x-A.x)+(y-A.y)*(y-A.y);return sqrt(tmp);}
}list[101];int main()
{int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++){scanf("%lf%lf",&list[i].x,&list[i].y);}int size=0;//抽象出的边的总数for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){//连接两点的线段抽象成边edge[size].a=i;edge[size].b=j;//该边的两个顶点编号edge[size].cost=list[i].getDistance(list[j]);//边权值为两点之间的长度size++;//边的综述增加}//遍历所有的点对}sort(edge,edge+size);//对边按权值递增排序for(int i=1;i<=n;i++){Tree[i]=-1;}double ans=0;for(int i=0;i<size;i++){int a=findRoot(edge[i].a);int b=findRoot(edge[i].b);if(a!=b){Tree[a]=b;ans+=edge[i].cost;}}//最小生成树printf("%.2lf\n",ans);}return 0;
}

最小生成树算法除了 Kruskal 算法,还有其他一些算法,比较有名的还有 Prim 算法。但两者在机试题上应用时差别不大,所以这里不再讨论 Prim算法。

Freckles - 九度 OJ 1144相关推荐

  1. 打不开磁盘配额linux,九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)...

    题目描述: 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买.请问:你用有限的资金最 ...

  2. 非常可乐(九度 OJ 1457)

    非常可乐(九度 OJ 1457) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 1.题目描述: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是 seeyou 却不这么认为.因为每次当 see ...

  3. 九度OJ 题目1179:阶乘

    /********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1179:阶乘 * 来源:http://ac.jo ...

  4. 九度OJ——1028继续畅通工程

    题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修 ...

  5. Leagal or Not - 九度 OJ 1448

    Leagal or Not - 九度 OJ 1448 题目 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: ACM-DIY is a large QQ group where man ...

  6. 九度OJ 题目1069:查找学生信息 随笔

    ** 九度OJ 题目1069:查找学生信息 ** 题目描述如下: 输入N个学生的信息,然后进行查询. 输入 输入的第一行为N,即学生的个数(N<=1000) 接下来的N行包括N个学生的信息,信息 ...

  7. 九度OJ 题目1203:IP地址

    /********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1203:IP地址 * 来源:http://ac. ...

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

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

  9. 九度OJ 1011:最大连续子序列 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5615 解决:2668 题目描述: 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...

最新文章

  1. maven netbeans 导入_Maven - NetBeans
  2. cpu飙升 死循环_记一次CPU飙升BUG
  3. Vue教程5【vuex】getters,mapState,mapGetters,mapActions,mapMutations,模块化namespace
  4. 以杨辉三角形的三种实现体会python的编程特性
  5. Git问题Everything up-to-date解决
  6. 为何断点不停 Application_Start()方法
  7. 在IT的世界里,分享是一种快乐.
  8. 第十届常州国际动漫艺术周
  9. 从Nginx、Apache工作原理看为什么Nginx比Apache高效!
  10. e站host地址_ip地址基础入门知识
  11. 天猫魔盒1代TMB100E刷机, 以及右声道无声的问题
  12. OFD、PDF 系列软件说明(OFD阅读器--OFD模版设计器--OFD转PDF)
  13. 软件逆向工具常用快捷键
  14. android判断是否是蓝牙耳机,如何验证蓝牙耳机是否在Android上连接?
  15. 快速排序C语言实现 - 源码详解
  16. 求学信计算机专业英语,求学信英文版范文
  17. 【线性代数】n阶行列式展开多少项?
  18. Android Data Binding 初识
  19. apscheduler使用中的时区问题
  20. 这几本值得你一看再看的程序员素养必备好书

热门文章

  1. 核高基向左,生产性服务向右,只是完整的左右手而已
  2. 二叉树如何求两个叶节点的最近公共祖先--re
  3. 官方文档翻译《The Libra Blockchain》之执行交易(二)
  4. C++模拟与高精度——玩具谜题
  5. html字体设置大小打印无效,css font-size属性怎么不管用?
  6. Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收
  7. SPI中NSS/CS使用和SPI常见问题
  8. 忆2011年的秋天:一个人的项目
  9. 数学建模清风微信公众号的习题答案(挑战篇-数据异常值处理)
  10. Kubernetes基础详解