最小生成树的模板题,注意保存S个用到的最大的边长。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int x[505],y[505];
typedef struct node
{
int x,y;
double dis;
bool operator <(const node &th) const
{
return th.dis>dis;
}
node(int a=0,int b=0,double d=0)
{
x=a,y=b,dis=d;
}
} node;
node edge[500*250+10];
int num,p[510];
double DIS (int i,int j)
{
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
int find(int x)
{
return x==p[x]?x:p[x]=find(p[x]);
}
int main()
{
// freopen("in.txt","r",stdin);
int cas,S,P;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&S,&P);
num=0;
for(int i=0; i<P; i++)
scanf("%d%d",&x[i],&y[i]);
for(int i=0; i<P; i++)
{
for(int j=i+1; j<P; j++)
{
double dd=DIS(i,j);
node e(i+1,j+1,dd);
edge[num++]=e;
}
}
sort(edge,edge+num);
for(int i=0; i<=P; i++)
p[i]=i;
queue<double>st;
for(int i=0; i<num; i++)
{
int x=find(edge[i].x);
int y=find(edge[i].y);
if(x!=y)
{
p[x]=y;
cout<<edge[i].x<<" "<<edge[i].y<<" "<<edge[i].dis<<endl;
st.push(edge[i].dis);
if((int)st.size()>S)
st.pop();
}
}
printf("%.2lf\n",st.front());
}
return 0;
}