hdu1875

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<math.h>

#define MAXN 105
#define inf 1000000000

typedef double elem;

elem prim(int n,elem mat[][MAXN]){
    elem min[MAXN],ret=0;
    int v[MAXN],i,j,k;
    for (i=0;i<n;i++)
        min[i]=inf,v[i]=0;
    for (min[j=0]=0;j<n;j++){
        for (k=-1,i=0;i<n;i++)
            if (!v[i]&&(k==-1||min[i]<min[k]))
                k=i;
        if(ret == inf)
            return -1;
        for (v[k]=1,ret+=min[k],i=0;i<n;i++)
            if (!v[i]&&mat[k][i]<min[i])
                min[i]=mat[k][i];
    }
    return ret;
}

int main(){
    int i;
    int j;
    int n;
    int m;
    int island[105][3];
    elem distance[105][105];
   // freopen("in_prim.txt","r",stdin);
   // freopen("out.txt","w",stdout);
    scanf("%d",&n);
    while(n--){
        scanf("%d",&m);
        for(i=0;i<m;i++){
            scanf("%d %d",&island[i][0],&island[i][1]);
        }
        for(i=0;i<m;i++){
            for(j=i;j<m;j++){
                if(i==j){
                    distance[i][j] = inf;
                }else{
                    elem disbuf = sqrt((elem)(island[j][0]-island[i][0])*(island[j][0]-island[i][0])
                        +(island[j][1]-island[i][1])*(island[j][1]-island[i][1]));//注意进行数据类型强转,否则会出现编译错误
                    if(disbuf < 10 || disbuf > 1000){
                        distance[i][j] = inf;
                        distance[j][i] = inf;
                    }else{
                        distance[i][j] = disbuf;
                        distance[j][i] = disbuf;
                    }
                }
            }
        }
        double bufref = prim(m,distance);

        if(bufref != -1)
            printf("%.1lf\n",bufref*100);
        else
            printf("oh!\n");
    }
    return 0;
}

 

posted @ 2013-04-28 13:27  kahreman  阅读(197)  评论(0编辑  收藏  举报