很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;
}