问题来了:怎样才能在以最少虫洞的情况下,并且虫洞的长度总和最小,使一个时空星系中所有星球连接在一起?

Input

有许多组测试数据,每组测试数据中,第一行一个n(2<=n<=2000),表示某星系恒星的数量.

接下来n行,每行4个整型数据x,y,z,t(0<=x,y,z,t<=1000).表示恒星在宇宙中的空间坐标点以及时间的维度t(忽略计算恒星的体积大小)。

Output

输出1行,包含三个数字(用一个空格区分,注意最后一个数字后面没空格).

第一个是需要虫洞的数量,第二个是所有虫洞总长度之和(输出后4位小数).第三个是最长的虫洞的长度(输出后4位小数).

Sample Input

4
0 0 0 0
0 1 1 0
1 1 1 0
0 0 0 1

Sample Output

3 3.4142 1.4142

Hint

我们知道,1维 空间 上的距离d=x

我们知道,2维 空间 上的距离

我们知道,3维 空间 上的距离

类似地, 4维 时空 上的距离

Sample中 0 0 0 0,我们可以想象为是地球,而0 1 1 0是木星,1 1 1 0是金星,0 0 0 1是未来1个世纪后的地球。

还有的是,注意星球的数量有点多,大家注意处理。

代码1

prim算法

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
#define INF 0x7F800000int mtx[2005][5];int dist[2005];int getDist(int i,int j)
{int ret = (mtx[i][1]-mtx[j][1])*(mtx[i][1]-mtx[j][1])+(mtx[i][2]-mtx[j][2])*(mtx[i][2]-mtx[j][2])+(mtx[i][3]-mtx[j][3])*(mtx[i][3]-mtx[j][3])+(mtx[i][4]-mtx[j][4])*(mtx[i][4]-mtx[j][4]); return ret;
}int main()
{int t,n,i,j,k;while(   scanf("%d",&n)!=EOF){    for (k=1;k<=n;k++)scanf("%d%d%d%d",&mtx[k][1],&mtx[k][2],&mtx[k][3],&mtx[k][4]);for (j=1;j<=n;j++)           //创建第一组dist{  dist[j]=getDist(1,j);} double ans=0;double tmp=0;for (k=2;k<=n;k++)                     //不断更新dist{int minEdge=INF;int minpoint;        //   minEdge记录当前往外扩展的最小非零边权,minPoint记录对应边指向的节点编号for (j=1;j<=n;j++)                     //不断更新dist{if (dist[j]!=0 && dist[j]<minEdge)  //找到最小加权边与点{minEdge=dist[j];minpoint=j;}}if (tmp<minEdge)  tmp=minEdge;dist[minpoint]=0;       //将当前节点标记为已加入生成树,dist值置零ans+=sqrt(minEdge);           //累计生成树的路径长度for (j=1;j<=n;j++)                    用此节点一一跟新其他点的dist值{if (  getDist(minpoint,j)<dist[j]   )dist[j]=(getDist(minpoint,j));} } printf("%d %.4lf %.4lf\n",n-1,ans,sqrt(tmp) );}return 0;
} 

代码2

克鲁斯卡尔算法

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int g[2005];
int f[2005][5];int find(int x)   //x所在集合的根
{if(x==g[x]) return x;return g[x]=find(g[x]);
}struct aaaa
{int u,v;int weight;
};aaaa edge[2000003]; bool cmp(aaaa a,aaaa b)
{  return  (a.weight<b.weight);
}int main()
{ int t,n,i,j,k,pp,s,p;while(scanf("%d",&t)!=EOF){for (i=1;i<=t;i++){ scanf("%d%d%d%d",&f[i][1],&f[i][2],&f[i][3],&f[i][4]);}   for(int j=1;j<=t;j++) g[j]=j;  //初始化为自己**********************int ko=1;for (j=1;j<=t;j++){for (k=j+1;k<=t;k++){edge[ko].u=j;edge[ko].v=k;edge[ko].weight=     (  (f[j][1]-f[k][1])*(f[j][1]-f[k][1])+(f[j][2]-f[k][2])*(f[j][2]-f[k][2])+(f[j][3]-f[k][3])*(f[j][3]-f[k][3])+(f[j][4]-f[k][4])*(f[j][4]-f[k][4])         );  ko++;}} sort(edge+1,edge+ko,cmp);double z=0;int z1=0;double tmp=edge[1].weight;for (j=1;j<=t*(t-1)/2;j++){ int sb=find( edge[j].v);               //找根int sa=find( edge[j].u);          //找根if ( sa!=sb ){ g[sb]=sa;                       if (edge[j].weight>tmp) tmp=edge[j].weight;z+=sqrt(edge[j].weight);z1++;if (z1>=(t-1)) break;}}printf("%d %.4lf %.4lf\n", z1,z,sqrt(tmp));}return 0;
}

SZUOJ-Problem(J16):Bright stars最小生成树相关推荐

  1. HDOJ 2642 HDU 2642 Stars ACM 2642 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋   题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2642 题目描述: ...

  2. hduoj Stars 二维树状数组

    话说这道题是一道不折不扣的二维树状数组的水题,可是对于我这种菜鸟中的vip来说,却还是纠结了很久很久..留下做个模板吧..... 题目: Yifenfei is a romantic guy and ...

  3. bzoj 1601 最小生成树

    原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1601 最小生成树的比较水的题,我们只需要加一个源点,连向所有的点,边权为每个点建水库的代价 ...

  4. D - Counting Stars HDU - 7059

    D - Counting Stars HDU - 7059 题解: 长度为n的序列a,有三个操作: 对某个区间进行询问 对于某个区间内的每个数ai,减去ai&(-ai) 对于某个区间内的每个数 ...

  5. 图像拼接--A multiresolution spline with application to image mosaics

    A multiresolution spline with application to image mosaics <Acm Trans on Graphics> , 1983 , 2 ...

  6. Unskilled in English is looked down on by people (composition)

    1.单词正确 2.老师准确 3.老师多变 4.语法正确 5.语法准确多变 1.三段论 2.多用逻辑关系词 3.多用代词代替 选词不如选词组选词组不如选句子,选词尽量往长选 简单句: 被动: paren ...

  7. POJ 2395 Out of Hay

    http://poj.org/problem?id=2395 裸最小生成树 输出树中最大cost的边值 直接prim 1 #include <iostream> 2 #include &l ...

  8. 旅行comf HYSBZ - 1050

    https://www.lydsy.com/JudgeOnline/problem.php?id=1050​​​​​​ 最小生成树变形 没想到.. 一开始想的枚举最小二分最大 但是这些边无法确定走不走 ...

  9. ACM学习:例题完成总结与期中心得

    本周主要的学习内容就是刷题了,50余道的题全部过了一遍,但AC却只有20多,而且这周cf打了一次比赛,牛客打了一次比赛,不过体会最深的,还是对于例题的学习. 一.例题分析 本周A的题目主要集中在前半部 ...

最新文章

  1. ps添加的阴影怎么去除_【PS摄影后期教程】去除阴影色块三种方法
  2. NER数据增强、badcase处理、数据优化
  3. java 圆桌_约瑟夫问题求解释(圆桌问题)Java
  4. 《Orange’s 一个操作系统的实现》3.保护模式3----DOS加载.EXE过程
  5. windows下xmllib2使用简介 64位
  6. node.js 针对不同的请求路径(url) 做出不同的响应
  7. C++——容器小整理
  8. pytorch1.7教程实验——使用 TensorBoard 可视化模型,数据和训练
  9. 你们要的二维码测试点来了,扫它!
  10. OpenGL基础23:平行光与点光源
  11. error: Program received signal SIGSEGV, Segmentation fault. (Codeblocks, C++)
  12. 【工具】ubuntu16安装sendip发包工具,模拟发送tcp/udp/icmp报文
  13. java线程生命周期的图示以及文字说明
  14. excel宏-自定义筛选查询
  15. SpringBoot2.0启动日志中出现The APR based Apache Tomcat Native library which allows optimal performance
  16. 维修服务器的请示,关于更换云服务器的请示
  17. Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
  18. 考研线性代数题型总结
  19. 学习如何做好网站关键词的诊断工作
  20. Java培训,看这一篇就够了

热门文章

  1. pythonML学习笔记ch2-perceptron
  2. CSerialPort教程(6) - 以第三库方式使用CSerialPort
  3. CSerialPort串口类的修正版2014-01-10
  4. Camtasia Studio2022简体中文安装激活教程
  5. python实现支付宝在线支付功能
  6. 软银NAO机器人视觉防抖系统
  7. 统计字符串中字母个数,不分大小
  8. JSpider(2):JSpider是什么?
  9. 利用sed命令插入文本
  10. win7字体_onenote无法同时或分别设置默认的中英文字体,如何解决?