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;

}

 

你可能感兴趣的:(uva)