您的位置:首页 > 其它

uva10034 - Freckles

2012-11-17 00:43 302 查看
给出点的坐标,求出将所有的点连起来的最小长度。

#include<stdio.h>

#include<math.h>

struct node

{

    double x,y;

}p[101];

double map[101][101],a[101];

int vis[101],n;

void prim()

{

    int i,j,min_f;

    double min,sum=0.0;

    for(i=0; i<n; i++)

    {

        a[i]=map[0][i];

        vis[i]=0;

    }

    vis[0]=1;

    for(i=1; i<n; i++)

    {

        min=100000000.0;

        min_f=0;

        for(j=0; j<n; j++)

        {

            if(!vis[j]&&min>a[j])

            {

                min=a[j];

                min_f=j;

            }

        }

        vis[min_f]=1;

        sum=a[min_f]+sum;

        for(j=0; j<n; j++)

        {

            if(!vis[j]&&map[min_f][j]<a[j])

                a[j]=map[min_f][j];

        }

    }

    printf("%.2f\n",sum);

}

int main()

{

    int i,j,m;

    scanf("%d",&m);

    while(m--)

    {

        scanf("%d",&n);

        for(i=0;i<n;i++)

        {

            map[i][i]=0;

            int x,y;

            scanf("%lf%lf",&p[i].x,&p[i].y);

            for(j=0;j<i;j++)

            {

                map[i][j]=map[j][i]=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));

            }

        }

        prim();

        if(m)printf("\n");

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: