hdu 1160(最小生成树)

题意:给出一个数n,接下来有n个行,每行给出一个点的x坐标和y坐标,求连接每个点的最小消耗。

 

#include<stdio.h>

#include<math.h>

#include<string.h>

int n;

double dis[101][101];

int vis[101];

double lowcost[101];

int inf=1000000;

typedef struct

{

    double x,y;

}point;

double prim()

{

    int i,j;

    memset(vis,0,sizeof(vis));

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

        lowcost[i]=dis[0][i];

    vis[0]=1;

 

    double ans=0;

    double min;

    int k;

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

    {

        min=inf;

        k=0;

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

            if(!vis[j]&&lowcost[j]<min)

            {

                min=lowcost[j];

                k=j;

            }

           

            ans+=min;

            vis[k]=1;

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

                if(!vis[j]&&lowcost[j]>dis[k][j])

                    lowcost[j]=dis[k][j];

    }

    return ans;

}

int main()

{

   

   int i,j;

  point co[101];

    while(scanf("%d",&n)!=EOF)

    {

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

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

                dis[i][j]=inf;

        

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

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

 

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

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

                dis[i][j]=dis[j][i]=sqrt((co[i].x-co[j].x)*(co[i].x-co[j].x)+(co[i].y-co[j].y)*(co[i].y-co[j].y));

       

                double an=prim();

                printf("%.2lf\n",an);

               

           

    }

    return 0;

}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值