1002 Problem B


题意:给定一些点的坐标,求将所有点连通的最小长度。

思路:最小生成树的问题,因为给出的是点的坐标,所以要先处理一下,得到任意两点间的距离,将其存入邻接矩阵中,利用prim算法即可。

感想:prim算法的使用,关键还是在于理解算法,以及判定的条件。

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

using namespace std;

int n;

double d[110],map[110][110],mmin;

const double inf=10000000;

double prim(){

    int v[110]={0};

    int i,k,m,t=1;

    double sum=0;

    v[t]=1;

    d[t]=0;

    for(k=2;k<=n;k++){

        mmin=inf;

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

        if(v[i]!=1){

           if(d[i]>map[t][i])

               d[i]=map[t][i];

           if(mmin>d[i]){

                mmin=d[i];

                m=i;

            }

        }

        v[m]=1;

        t=m;

        sum+=d[m];

    }

    return sum;

}

int main(){

    double a[110],b[110];

    int i,j;

    while(cin>>n){

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

           cin>>a[i]>>b[i];

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

            d[i]=inf;

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

               map[i][j]=inf;

        }

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

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

               map[i][j]=map[j][i]=sqrt((a[i]-a[j])*(a[i]-b[j])+(b[i]-b[j])*(b[i]-b[j]));

        }

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

    }

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值