#include <bits/stdc++.h>
using namespace std;
class Edge
{
public:
long long l,r;
double val;
}eline[40000000];
double X[200000],Y[200000],n,ans;
long long father[200000],cnt,l;
bool operator<(Edge L,Edge R)
{
return L.val<R.val;
}
long long root(long long node)
{
return father[node]==node?node:father[node]=root(father[node]);
}
void tree_add(long long u,long long v,double w)
{
l++;
eline[l].l=u;
eline[l].r=v;
eline[l].val=w*1.0;
}
double walk(long long i,long long j)
{
double fx=(X[i]-X[j])*1.0,fy=(Y[i]-Y[j])*1.0;
return pow(fx*fx+fy*fy,0.5);
}
void kruskal(long long k)
{
for(k;k<=l;k++)
{
long long fx=root(eline[k].l),fy=root(eline[k].r);
if (fx!=fy)
{
father[fx]=fy;
ans+=eline[k].val*1.0;
cnt++;
}
if (cnt==n-1) return;
}
}
int main()
{
//最小生成树2
long long i,j;
scanf("%lf",&n);
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&X[i],&Y[i]);
father[i]=i;
}
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
tree_add(i,j,walk(i,j));
sort(eline+1,eline+l+1);
kruskal(1);
printf("%lf",ans);
}
评测机炸了,全 MLE,还有正在评测中的,估计是没希望了。
蒟蒻刚学生成树