uva 10034 Freckles

最小生成树

#include <cstdio>
#include <cstring>
#include <cmath>
#define INF 1000000000.0
#define N 110
double g[N][N],lowcost[N],x[N],y[N];
int n,cov[N];

double dis(int i , int j)
{  return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); }
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            scanf("%lf%lf",&x[i],&y[i]);

        for(int i=1; i<=n; i++) g[i][i]=INF;
        for(int i=1; i<=n; i++)
            for(int j=i+1; j<=n; j++)
                g[i][j]=g[j][i]=dis(i,j);

        double sum=0;
        memset(cov,0,sizeof(cov));
        for(int i=1; i<=n; i++) lowcost[i]=g[1][i];
        lowcost[1]=0;  cov[1]=1;
        for(int nn=1; nn<n; nn++)
        {
            double min=INF; int u=1;
            for(int i=1; i<=n; i++)
                if(!cov[i] && lowcost[i]<min)
                { min=lowcost[i]; u=i; }
            cov[u]=1;
            sum+=lowcost[u];

            for(int v=1; v<=n; v++)
                if(!cov[v] && g[u][v]<lowcost[v])
                    lowcost[v]=g[u][v];
        }

        printf("%.2f\n",sum);
        if(T) printf("\n");
    }    
    return 0;
}

 

posted @ 2012-12-07 20:54  Titanium  阅读(247)  评论(0编辑  收藏  举报