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;
}