poj 2349

#include<iostream>
#include<fstream>
#include<cmath>

using namespace std;

int n,m;

struct e{
    int s,t;
    double w;
};

e edge[250001];

int x[501],y[501];
int top;

void add(int s,int t,double w){
    edge[++top].s=s;
    edge[top].t=t;
    edge[top].w=w;
};

int cmp(const void *a,const void *b){
    if( (*(e*)a).w>(*(e*)b).w)
        return  1;
    return -1;
}

int f[501],rank[501];

void init(){
    int i;
    for(i=1;i<=m;i++)
    {
        f[i]=i;
        rank[i]=0;
    }
}

int father(int s){
    if(s!=f[s])
        f[s]=father(f[s]);
    return f[s];
}

void unionset(int s,int t){
    int i=father(s),j=father(t);
    if(rank[i]<rank[j])
        f[i]=j;
    else
    {
        f[j]=i;
        if(rank[i]==rank[j])
            rank[i]++;
    }
}


void read(){
//    ifstream cin("in.txt");
    int i,j,k;
    int cas;
    cin>>cas;
    while(cas--)
    {
        cin>>n>>m;
        top=0;
        init();
        for(i=1;i<=m;i++)
            cin>>x[i]>>y[i];
        for(i=1;i<=m;i++)
            for(j=i+1;j<=m;j++)
            {
                add(i,j,sqrt(1.*(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
            }
        qsort(edge+1,top,sizeof(e),cmp);
        j=0;
        for(i=1;i<=top;i++)
        {
            if(father(edge[i].s)!=father(edge[i].t))
            {
                unionset(edge[i].s,edge[i].t);
                j++;
   
                if(m-n==j)
                {
                    printf("%.2lf\n",edge[i].w);
                    break;
                }
            }
        }
    }

}

int main(){
    read();
    return 0;
}

posted on 2011-06-01 17:02  宇宙吾心  阅读(275)  评论(0)    收藏  举报

导航