HDU 1162

来源:互联网 发布:程序员被黑 编辑:程序博客网 时间:2024/06/06 06:31

最小生成树就是求,最短路!每个点之间必须是联通的!可以是最短路径,也可以是最少花费!



#include <iostream>

#include <cstdio>
#include <cstring>
#include <cmath>
const int maxn=105;
const int MAX=10000;
double map[maxn][maxn];
double dist[maxn];
bool isvisit[maxn];
typedef struct node
{
  double x;
  double y;
}node;


void init()
{
    int i,j;
    for(i=0; i<maxn; i++)
    {
        for(j=0; j<maxn; j++)
        {
            if(i==j)map[i][j]=0;
            map[i][j]=MAX;
        }
    }
}


double caculat(node a, node b)
{
    double len;
    len=sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
    return len;
}


double prim(int n)
{
    int i,j,pos,min;
    double sum=0;


    memset(isvisit,false,sizeof(isvisit));


    for(i=1; i<=n ;i ++)
        dist[i]=map[1][i];
    isvisit[1]=true;
    dist[1]=MAX;


    for(i=1; i<n; i++)
    {
        min=MAX;
        for(j=1; j<=n; j++)
        {
            if(!isvisit[j]&&min>dist[j])
            {
                min=dist[j];
                pos=j;
            }
        }
        isvisit[pos]=true;
        sum+=dist[pos];


        for(j=1; j<=n; j++)
        {
            if(!isvisit[j]&&dist[j]>map[pos][j])
            {
                dist[j]=map[pos][j];
            }
        }
    }
    return sum;
}






int main()
{
    node p[maxn];
    int n,i,j;
    double sum,len;
    while(scanf("%d",&n)!=EOF)
    {
        init();
        for(i=1; i<=n; i++)
        {
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        for(i=1; i<n; i++)
        {
            for(j=i+1; j<=n; j++)
            {
                len=caculat(p[i],p[j]);
                 map[i][j]=map[j][i]=len;
            }
        }
        sum=prim(n);
        printf("%.2lf\n",sum);
    }
    return 0;
}
原创粉丝点击