HDU 1162 Eddy's picture

http://acm.hdu.edu.cn/showproblem.php?pid=1162

最简单的最小生成树。。。

View Code
#include <stdio.h>

#include <stdlib.h> 

#include <math.h> 

int p[110];

int cnt,n; 

typedef struct L

{

    int a,b;

    double d; 

}L;

L r[10000];     

double dis(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));} 

int cmp(const void*a,const void*b)

{

    struct L*c=(struct L*)a;

    struct L*dd=(struct L*)b;

    return c->d-dd->d>0?1:-1;

} 

int find(int x){return p[x]==x?x:p[x]=find(p[x]);} 

double Kruskal()

{

    double ans=0; 

    int x,y,i; 

    for(i=0;i<n;i++)p[i]=i; 

    qsort(r,cnt,sizeof(L),cmp);

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

    {

        x=find(r[i].a);

        y=find(r[i].b);

        if(x!=y){ans+=r[i].d;p[x]=y;} 

    }

    return ans; 

}

int main()

{

    int i,j;

    double x[110],y[110]; 

    while(~scanf("%d",&n))

    {

        cnt=0; 

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

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

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

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

            { 

                r[cnt].a=i;

                r[cnt].b=j;

                r[cnt++].d=dis(x[i],y[i],x[j],y[j]);

            } 

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

    }

    return 0;

}  

 

 

你可能感兴趣的:(HDU)