#求各位dalao指教
by 特大号的黑音 @ 2017-06-01 22:50:08
借楼..也是40分
```cpp
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct wire{
int a,b,v;
}map[300000];
struct station{
int x,y;
}m[501];
int S,P,x,y,fa[501],cnt,t;
double ans;
int dis(int x1,int x2,int y1,int y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);}
bool cmp(wire x,wire y){return x.v<y.v;}
int ask(int x){return fa[x]=x?x:fa[x]=ask(x);}
void unite(int x,int y){fa[x]=y;}
void add(int x,int y){map[++cnt].a=x;map[cnt].b=y;map[cnt].v=dis(m[x].x,m[y].x,m[x].y,m[y].y);}
void init(){
scanf("%d%d",&S,&P);
for(int i=1;i<=P;i++){
scanf("%d%d",&x,&y);
m[i].x=x;m[i].y=y;
}
for(int i=2;i<=P;i++)for(int j=1;j<i;j++)add(i,j);
sort(map+1,map+1+cnt,cmp);
}
void Kruskal(){
t=0;
for(int i=1;i<=P;i++)fa[i]=i;
for(int i=1;i<=cnt;i++){
int x=ask(map[i].a);
int y=ask(map[i].b);
if(x!=y){
unite(x,y);
ans=sqrt(map[i].v);
if(++t==P-S)return;
}
}
}
void print(){printf("%.2lf",ans);}
int main(){
init();
Kruskal();
print();
return 0;
}
```
by 2344b @ 2018-03-28 11:09:25