POJ 2031 Building a Space Station
题目链接:http://poj.org/problem?id=2031
题目意思是给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能够相互连通。如果两个球有重叠的部分则算为已连通,无需再搭桥。求搭建通路的最小费用(费用就是边权,就是两个球面之间的距离)。就是简单的最小生成树。
prim:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 const int MAXN = 105; 7 struct data { 8 double x , y , z , r; 9 }a[MAXN]; 10 double d[MAXN] , cost[MAXN][MAXN] , INF = 1e9; 11 bool vis[MAXN]; 12 13 void init(int n) { 14 for(int i = 0 ; i <= n ; i++) { 15 for(int j = 0 ; j <= n ; j++) 16 cost[i][j] = INF; 17 d[i] = INF; 18 vis[i] = false; 19 } 20 } 21 22 inline double f(double x , double y) { 23 return (x - y) * (x - y); 24 } 25 26 double dis(int i , int j) { 27 double temp = f(a[i].x , a[j].x) + f(a[i].y , a[j].y) + f(a[i].z , a[j].z); 28 return sqrt(temp); 29 } 30 31 double prim(int s , int n) { 32 d[s] = 0; 33 double res = 0; 34 while(1) { 35 int u = -1; 36 double Min = INF; 37 for(int i = 1 ; i <= n ; i++) { 38 if(!vis[i] && Min > d[i]) { 39 Min = d[i]; 40 u = i; 41 } 42 } 43 if(u == -1) 44 return res; 45 vis[u] = true; 46 res += d[u]; 47 for(int i = 1 ; i <= n ; i++) { 48 d[i] = (d[i] > cost[u][i] ? cost[u][i] : d[i]); 49 } 50 } 51 } 52 53 int main() 54 { 55 int n; 56 ios::sync_with_stdio(false); 57 while(cin >> n && n) { 58 init(n); 59 for(int i = 1 ; i <= n ; i++) { 60 cin >> a[i].x >> a[i].y >> a[i].z >> a[i].r; 61 } 62 for(int i = 1 ; i < n ; i++) { 63 for(int j = i + 1 ; j <= n ; j++) { 64 double temp = a[i].r + a[j].r , temp2 = dis(i , j); 65 if(temp >= temp2) 66 cost[i][j] = cost[j][i] = 0; 67 else 68 cost[i][j] = cost[j][i] = temp2 - temp; 69 } 70 } 71 double res = prim(1 , n); 72 printf("%.3f\n" , res); 73 } 74 }
kruskal:就是把边从小到大排序一下,用并查集判断祖节点是否相同,不同就合并。
转载于:https://www.cnblogs.com/Recoder/p/5304040.html
POJ 2031 Building a Space Station相关推荐
- POJ - 2031 Building a Space Station (最小生成树)
题目链接:http://poj.org/problem?id=2031点击打开链接 Building a Space Station Time Limit: 1000MS Memory Limit ...
- zoj 1718 poj 2031 Building a Space Station
最小生成树,用了Kruskal算法.POJ上C++能过,G++不能过... 算出每两个圆心之间的距离,如果距离小于两半径之和,那么这两个圆心之间的距离直接等于0,否则等于距离-R[i]-R[j]. # ...
- pku 2031 Building a Space Station 最小生成树+精度控制
http://poj.org/problem?id=2031 题意就是给你n个球的(球心以及半径),然后求最小生成树就欧了,这里的关键部分是对于重复的球的路径长度的处理 #include <io ...
- POJ_2031 Building a Space Station
Building a Space Station 链接 POJ_2031 Building a Space Station Describe You are a member of the space ...
- poj2031 Building a Space Station
题目链接:http://poj.org/problem?id=2031 题意:给你n个球,让你用最小的花费,把这n个球联通,如果两个球相交,就默认联通,否者连接这两个球的花费就是,球面之间的最短距离, ...
- I. Space Station(hash记忆化+dp)
<文章>陆游 文章本天成,妙手偶得之. 粹然无疵瑕,岂复须人为. 君看古彝器,巧拙两无施. 汉最近先秦,固已殊淳漓. 胡部何为者,豪竹杂哀丝. 后夔不复作,千载谁与期? I. Space ...
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads 题目链接HDU 题目链接POJ 题意: 有n个牛棚, 还有两个中转站S1和S2, S1和S2用一条路连接起来. 为了使得随意牛棚两个 ...
- 【POJ 1788 --- Building a New Depot】
[POJ 1788 --- Building a New Depot] Description Advanced Cargo Movement, Ltd. is successfully expand ...
- Building a Space Station--POJ 2031
1.题目类型:计算几何,最小生成树. 2.解题思路:(1)获得所有点路径长度的矩阵map[][]:(2)利用Prim算法求解最小生成树. 3.注意事项:数学操作,中间值全部用double保存. 4.实 ...
最新文章
- [转帖]Runtime, Engine, VM 的区别是什么?
- zigbee 常规配置
- 第七十六期:糟糕!服务器被植入挖矿木马,CPU飙升200%
- python中获取异常描述与else用法
- 服务器修改域,服务器修改域名
- Cocos2d-X开发中国象棋《三》開始场景的实现
- Watson的未来就是IBM的未来
- Rabbitmq的安装及集群环境的搭建
- php怎么初始化融云sdk,初始化融云 SDK
- Android使用惠普打印机,USB直连静默打印
- magic4.0跟harmonyos,支持升级Harmony 2.0 Magic UI 4.0 9月中旬招募公测
- 常用的线性充电IC和开关充电IC的区别
- thinkphp 检测上传的图片中是否含有木马脚本
- 网上处方药物手册Rxlist 及其药学信息资源
- java机票编程_携程预订机票后台java开发编程
- 通俗理解TIM定时器并简单使用
- VideoSolo Blu ray Player for Mac(mac蓝光播放器)
- 从艾优尼之死,看Freeme OS的深远价值
- genus 综合流程
- Initialization in《The Java® Virtual Machine Specification Java SE 7 Edition》
热门文章
- 《Python编程从入门到实践》记录之第3章 列表简介总结——列表添加修改和删除元素(思维导图)
- C# + OpenCvSharp实现仿射变换
- 文本检测-EAST方法概述
- 译文 | 与TensorFlow的第一次接触 第四章:单层神经网络
- ubuntu14.04matlab2015b 测试caffe的Matlab接口
- deno mysql_从 Node 到 Deno
- Huawei LiteOS简介
- VMware vSphere、 ESXi、Vcenter、vSphere Client关系
- linux下ts转mp4,ffmpeg安装及实现视频格式的转换、分片(ts m3u8)
- java后台传一个对象到前台_前台判断对象中的一个布尔值_前后台分离的项目中,如何优雅的传输boolean类型的参数...