最小生成樹之poj2031

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章