很easy的题,水过~~~
题目大意:在三维空间中给出N个点的x,y,z座标,若两个点的距离<=0 ,则他们之间
的距离看做0 。 求出连接所有点的最小距离。
思路: 建图,prime 算法水过
注意:c++中确定小数点的数目(n)的函数
cout<<fixed<<precision(n)<<(double/float)m<<endl;
poj 2031
#include <queue>
#include <stack>
#include <math.h>
#include <vector>
#include <limits.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <functional>
#include <iomanip>
using namespace std;
const int M=100000;
double x[105],y[105],z[105],r[105],map[105][105];
int n;
double prime()
{
int i,j,visit[105],now=1;
double ans=0;
double low[105];
memset(visit,0,sizeof(visit));
visit[1]=1;
for(i=1;i<=n;i++)
if(i!=now)
low[i]=map[now][i];
for(i=1;i<n;i++)
{
double min=M;
for(j=1;j<=n;j++)
if(!visit[j]&&min>low[j])
min=low[j],now=j;
ans+=min;
visit[now]=1;
for(j=1;j<=n;j++)
if(!visit[j]&&low[j]>map[now][j])
low[j]=map[now][j];
}
return ans;
}
double Work(int i,int j)
{
double xx=fabs(x[i]-x[j]);
double yy=fabs(y[i]-y[j]);
double zz=fabs(z[i]-z[j]);
double m=xx*xx+yy*yy+zz*zz;
m=sqrt(m)-r[i]-r[j];
return m;
}
int main()
{
int i,j;
while(cin>>n&&n)
{
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
cin>>x[i]>>y[i]>>z[i]>>r[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j&&!map[i][j])
{
double temp=Work(i,j);
if(temp<=0)
temp=0;
map[i][j]=map[j][i]=temp;
}
cout<<fixed<<setprecision(3)<<prime()<<endl;
}
return 0;
}