首页 > 其他 > 详细

POJ 2031

时间:2014-08-26 21:18:06      阅读:285      评论:0      收藏:0      [点我收藏+]

最小生成树

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>

using namespace std;

const int Maxn=110;
struct Pex{
	double x,y,z;
	double r;
};
Pex pt[Maxn];
int n;
double map[Maxn][Maxn];
double disp[Maxn];

double dist(Pex &x,Pex &y){
	double a=x.x-y.x;
	double b=x.y-y.y;
	double c=x.z-y.z;
	double dis=sqrt(a*a+b*b+c*c);
	double e=dis-x.r-y.r;
	return e>0?e:0;
}

void solve(){
	bool vis[Maxn]; double ans=0;
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++)
	disp[i]=map[1][i];
	vis[1]=true;
	for(int i=1;i<=n;i++){
		double mint=1e10; int p=-1;
		for(int k=1;k<=n;k++){
			if(!vis[k]&&mint>disp[k]){
				mint=disp[k];
				p=k;
			}
		}
		if(p==-1) break;
		ans+=mint;
		vis[p]=true;
		for(int k=1;k<=n;k++){
			if(!vis[k]){
				disp[k]=min(disp[k],map[p][k]);
			}
		}
	}
	printf("%.3lf\n",ans);
}

int main(){
	while(scanf("%d",&n),n){
		for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
		map[i][j]=map[j][i]=0;
		for(int i=1;i<=n;i++)
		scanf("%lf%lf%lf%lf",&pt[i].x,&pt[i].y,&pt[i].z,&pt[i].r);
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				map[i][j]=map[j][i]=dist(pt[i],pt[j]);
			}
		}
		solve();
	}
	return 0;
}

  

POJ 2031

原文:http://www.cnblogs.com/jie-dcai/p/3938141.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!