模板题 刚学的最小生成树 有点小兴奋
#include <algorithm> #include <cstring> #include <cstdio> #include <cmath> using std::sort; struct dat { int nx; int ny; double nl; bool operator<(const dat p) const { return nl<p.nl; } }a[250010]; int n,s,b; double point[510][2]; int p[510]; int find(int x){return p[x]==x?x : p[x]=find(p[x]);} int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d",&s,&n); for(int i=1; i<=n; i++) scanf("%lf %lf",&point[i][0],&point[i][1]); int ans=0; for(int i=1; i<=n; i++) { for(int j=i+1; j<=n; j++) { a[ans].nx=i; a[ans].ny=j; double x=point[i][0]-point[j][0]; double y=point[i][1]-point[j][1]; a[ans++].nl=sqrt(x*x+y*y); } } sort(a,a+ans); int mm=n-s; int ou=0; for(int i=1; i<=n; i++) p[i]=i; double sum=0; for(int i=0; i<ans; i++) { int x=find(a[i].nx); int y=find(a[i].ny); if(x!=y) { //printf("%d %d\n",a[i].nx,a[i].ny); ou++; p[x]=y; if(ou<=mm) sum=a[i].nl; } } printf("%.2lf\n",sum); } return 0; }
浙公网安备 33010602011771号