SZUOJ-Problem(J16):Bright stars最小生成树
问题来了:怎样才能在以最少虫洞的情况下,并且虫洞的长度总和最小,使一个时空星系中所有星球连接在一起?
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最小生成树相关推荐
- HDOJ 2642 HDU 2642 Stars ACM 2642 IN HDU
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2642 题目描述: ...
- hduoj Stars 二维树状数组
话说这道题是一道不折不扣的二维树状数组的水题,可是对于我这种菜鸟中的vip来说,却还是纠结了很久很久..留下做个模板吧..... 题目: Yifenfei is a romantic guy and ...
- bzoj 1601 最小生成树
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1601 最小生成树的比较水的题,我们只需要加一个源点,连向所有的点,边权为每个点建水库的代价 ...
- D - Counting Stars HDU - 7059
D - Counting Stars HDU - 7059 题解: 长度为n的序列a,有三个操作: 对某个区间进行询问 对于某个区间内的每个数ai,减去ai&(-ai) 对于某个区间内的每个数 ...
- 图像拼接--A multiresolution spline with application to image mosaics
A multiresolution spline with application to image mosaics <Acm Trans on Graphics> , 1983 , 2 ...
- Unskilled in English is looked down on by people (composition)
1.单词正确 2.老师准确 3.老师多变 4.语法正确 5.语法准确多变 1.三段论 2.多用逻辑关系词 3.多用代词代替 选词不如选词组选词组不如选句子,选词尽量往长选 简单句: 被动: paren ...
- POJ 2395 Out of Hay
http://poj.org/problem?id=2395 裸最小生成树 输出树中最大cost的边值 直接prim 1 #include <iostream> 2 #include &l ...
- 旅行comf HYSBZ - 1050
https://www.lydsy.com/JudgeOnline/problem.php?id=1050 最小生成树变形 没想到.. 一开始想的枚举最小二分最大 但是这些边无法确定走不走 ...
- ACM学习:例题完成总结与期中心得
本周主要的学习内容就是刷题了,50余道的题全部过了一遍,但AC却只有20多,而且这周cf打了一次比赛,牛客打了一次比赛,不过体会最深的,还是对于例题的学习. 一.例题分析 本周A的题目主要集中在前半部 ...
最新文章
- ps添加的阴影怎么去除_【PS摄影后期教程】去除阴影色块三种方法
- NER数据增强、badcase处理、数据优化
- java 圆桌_约瑟夫问题求解释(圆桌问题)Java
- 《Orange’s 一个操作系统的实现》3.保护模式3----DOS加载.EXE过程
- windows下xmllib2使用简介 64位
- node.js 针对不同的请求路径(url) 做出不同的响应
- C++——容器小整理
- pytorch1.7教程实验——使用 TensorBoard 可视化模型,数据和训练
- 你们要的二维码测试点来了,扫它!
- OpenGL基础23:平行光与点光源
- error: Program received signal SIGSEGV, Segmentation fault. (Codeblocks, C++)
- 【工具】ubuntu16安装sendip发包工具,模拟发送tcp/udp/icmp报文
- java线程生命周期的图示以及文字说明
- excel宏-自定义筛选查询
- SpringBoot2.0启动日志中出现The APR based Apache Tomcat Native library which allows optimal performance
- 维修服务器的请示,关于更换云服务器的请示
- Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
- 考研线性代数题型总结
- 学习如何做好网站关键词的诊断工作
- Java培训,看这一篇就够了