poj 2031
来源:互联网 发布:绿盾防泄密软件 编辑:程序博客网 时间:2024/05/01 08:33
题意:
给你几个cell,求最小生成树(我直接把做法说出来了);
每个cell是三维的,如果相交则视为距离为0;
思路:
先求出每个cell之间的距离;
然后再prim算法;
源代码:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#define INF 0xfffffffusing namespace std;struct node{ double x; double y; double z; double r;}s[110];int mark[110],n;double w[110];double len[110][110];double distence(node a,node b){ double t=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)); if(t<a.r+b.r)return 0; return t-a.r-b.r;}//求每两个点的距离double prim(node e,int u){ double num=0; int ii,jj; int mi=0; double tt=0; w[0]=0; while(mi>-1) { mi=-1; num+=tt; tt=0xfffffff; for(ii=0;ii<u;ii++) { if(!mark[ii]&&w[ii]<tt) { mi=ii; tt=w[ii]; } } //cout<<mi<<endl; mark[mi]=1; //cout<<tt<<endl; for(ii=0;ii<u;ii++) { if(!mark[ii]&&len[mi][ii]<w[ii]) w[ii]=len[mi][ii]; } } return num;}//求最小生成树void init(){ for(int l=0;l<n;l++) w[l]=INF;}int main(){ int i,j,m; while(scanf("%d",&n),n) { memset(mark,0,sizeof(mark)); init(); for(i=0;i<n;i++) scanf("%lf%lf%lf%lf",&s[i].x,&s[i].y,&s[i].z,&s[i].r); for(i=0;i<n;i++) for(j=0;j<n;j++) { len[i][j]=distence(s[i],s[j]); //cout<<len[i][j]<<' '<<i<<' '<<j<<endl; } double rr=prim(s[0],n); printf("%.3f\n",rr); } return 0;}
- poj 2031
- poj 2031
- poj 2031
- POJ 2031
- poj 2031
- poj 2031
- POJ 2031
- POJ 2031
- POJ 2031
- poj 2031 Kruskal
- POJ 2031 prim
- poj 2031(prim)
- POJ
- poj
- POJ
- POJ
- poj
- poj
- 如何获取下拉框的值
- Android发送GET和POST请求DEMO
- 字符串系列——10010 Where's Waldorf?
- 6、王爽《汇编语言》笔记_实验8
- QT 界面和控件按某种关系比例增长
- poj 2031
- Oracle备份与恢复案例
- linux 批量 含空格文件名 重命名
- js获取时分秒
- Bayer图像处理(转)
- eclipse启动时无法创建java虚拟机
- 拥有线程安全和阻塞功能的vector类SemVector(LINUX平台)
- Log4j 日志级别
- 从rails升级到gem uninstall,gem cleanup与安装指定版本rails