首页 > 代码库 > poj2031--Building a Space Station
poj2031--Building a Space Station
题意:给你n个球 坐标 半径。球若相互覆盖或接触就算相连 让你求出最小的长度使得从任意一球出发能到达任意球; 思路:最小生成树 代码用g++交WA 用c++就A 无语。。。 #include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>#include <vector>#include <queue>#include <stdlib.h>#define N 110#define INF 10000000#define eps 10E-9//误差#define mem(a) memset(a,0,sizeof(a))using namespace std;struct node{ double x; double y; double z; double r;} ball[N];double mmap[110][110];double low[N];int vis[N];double dis(int x,int y)//球间距离{ double pd=sqrt((ball[x].x-ball[y].x)*(ball[x].x-ball[y].x)+(ball[x].y-ball[y].y)*(ball[x].y-ball[y].y)+(ball[x].z-ball[y].z)*(ball[x].z-ball[y].z)); double rr=ball[x].r+ball[y].r; if(pd>rr+eps) return pd-rr; return 0;}double prim(int n)//普利姆算法{ double result =0; int i,j,p; double mmin; memset(low,0,sizeof(low)); memset(vis,0,sizeof(vis)); vis[0]=1; p=0; for(i=1; i<n; i++) { low[i]=mmap[p][i]; } for(i=1; i<n; i++) { mmin=INF; p=-1; for(j=0; j<n; j++) { if(mmin>low[j]&&0==vis[j]) { mmin=low[j]; p=j; } } if (INF == mmin) return -1; result+=mmin; vis[p]=1; for(j=0; j<n; j++) { if(0==vis[j]&&low[j]>mmap[p][j]) low[j]=mmap[p][j]; } } return result;}int main(){ int n; int i,j,k; while(~scanf("%d",&n)&&n) { memset(mmap,0,sizeof(mmap)); for(i=0; i<n; i++) { scanf("%lf%lf%lf%lf",&ball[i].x,&ball[i].y,&ball[i].z,&ball[i].r); } for(i=0; i<n; i++)//建图 for(j=i+1; j<n; j++) { mmap[i][j]=mmap[j][i]=dis(i,j); } double ans=prim(n); printf("%.3lf\n",ans); } return 0;}
|
poj2031--Building a Space Station
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。