首页 > 代码库 > poj-2031 Building a Space Statio
poj-2031 Building a Space Statio
题目链接:点击打开链接
又是一发 G++ WA , C++ AC.
简单题:给出基站的三围坐标及半径 。若球面距离小于 0 距离为 0 ,否则为 圆心距离减去2个半径
#include <iostream> #include <stdio.h> #include <math.h> #include <algorithm> #include <string.h> #define INF 10000000 using namespace std; double map[110][110],dis[110]; int v[110]; struct node { double x,y,z,r; }p[110]; double makedis(int i,int j) { double ans = sqrt((p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y) + (p[i].z - p[j].z)*(p[i].z - p[j].z)); ans -= (p[i].r + p[j].r); if (ans <= 0.0000000001) return 0; else return ans; } double prim(int n) { int k; double min,sum=0; memset(v,0,sizeof(v)); memset(dis,0,sizeof(dis)); for(int i=1;i<=n;i++) dis[i]=map[1][i]; v[1]=1; dis[1]=0; for(int i=2;i<=n;i++) { k=-1; min = INF; for(int j=1;j<=n;j++) if(!v[j]&&min>dis[j]) { k=j; min=dis[j]; } sum += min; v[k]=1; for(int j=1;j<=n;j++) if(!v[j] && dis[j]>map[k][j]) dis[j]=map[k][j]; } return sum; } int main() { int n,m; while(cin>>n) { if(n == 0) break; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if (i != j) map[i][j] = INF; else map[i][j] = 0; } for(int i=1;i<=n;i++) { cin>>p[i].x>>p[i].y>>p[i].z>>p[i].r; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if (map[i][j] >= makedis(i,j)) { map[i][j] = makedis(i,j); map[j][i] = makedis(i,j); } } printf("%.3lf\n",prim(n)); } return 0; }
poj-2031 Building a Space Statio
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。