一道很久之前做的题,突然发现MLE一个点,卡不懂了,求求了qwq
#include<bits/stdc++.h>
using namespace std;
int n,m,q,f[5001],Q,W;
double ans;
inline int read()
{
int k=0,f=0;char c=getchar();
for(;!isdigit(c);c=getchar()) f|=c=='-';
for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
return f?-k:k;
}
struct point
{
int x,y;
}h[5001];
struct edge
{
short s,e;
double w;
}g[13000010];
inline int cmp(edge a,edge b)
{
return a.w<b.w;
}
inline int find(int s)
{
if(f[s]==s) return s;
else return f[s]=find(f[s]);
}
inline double k()
{
int cnt=0;
for(int i=1;i<=q;i++)
{
int x=find(g[i].s),y=find(g[i].e);
if(x!=y)
{
f[x]=y;
ans+=sqrt(g[i].w);
if(++cnt>=n-1) return ans;
}
}
}
signed main()
{
n=read();
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=n;i++)
{
h[i].x=read(),h[i].y=read();
for(int j=1;j<i;j++)
{
double u=(h[i].x-h[j].x+0.0)*(h[i].x-h[j].x+0.0)+(h[i].y-h[j].y+0.0)*(h[i].y-h[j].y+0.0);
g[++q]=(edge){i,j,u};
}
}
sort(g+1,g+1+q,cmp);
printf("%.2lf",k());
return 0;
}