您的位置:首页 > 其它

1002 Problem B

2016-06-25 11:29 211 查看
题意:给定一些点的坐标,求将所有点连通的最小长度。

思路:最小生成树的问题,因为给出的是点的坐标,所以要先处理一下,得到任意两点间的距离,将其存入邻接矩阵中,利用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;

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