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;
}
#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;
}
浙公网安备 33010602011771号