hoj1811 freckles

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
using namespace std;

const int N=105;
const int Max=20000;
int n;
double a[N],d[N][N],total;
bool f[N];

struct point
{
   double x,y;
}p[N];
double dist(point p1,point p2)
{
    return(sqrt((double)(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
void path()
{
    int k;
    f[1]=1;
    k=1;
    total=0;
    for(int i=2;i<=n;i++)
    {
        int mcost=Max;
        for(int j=2;j<=n;j++)
        {
            if(!f[j]&&(a[j]<mcost))
            {
                mcost=a[j];
                k=j;
            }
        }
        f[k]=1;
        total+=a[k];
        for(int t=2;t<=n;t++)
        {
            if(!f[t]&&(d[k][t]<a[t]))
            a[t]=d[k][t];
        }
    }
    return;
}

int main()
{
   while(cin>>n)
   {
       for(int i=1;i<=n;i++)
       {
           cin>>p[i].x>>p[i].y;
           f[i]=0;
       }
       for(int i=1;i<=n;i++)
       {
           for(int j=i+1;j<=n;j++)
           {
               d[i][j]=dist(p[i],p[j]);
               d[j][i]=d[i][j];
           }
       }
       for(int k=2;k<=n;k++)
       {
           a[k]=d[1][k];
       }
       a[1]=0;
       path();
      printf("%.2lf\n",total);
      //cout<<a[s]<<endl;
   }
    return 0;
}

 

posted @ 2012-02-15 11:33  wuzhibin  阅读(143)  评论(0)    收藏  举报