若存所有边,则要的内存会超,求prim的特判
#include<bits/stdc++.h>
#define inf 1000005
#define N 12502500
//若要存所有边,则e要开N个,但开9000000个就MLE,样例2就是一个有4999个点的,求如何特判
using namespace std;
struct node
{
int to,nxt;
double data;
}e[N];
int head[5005],n,x[5005],y[5005],cnt,v;
double sum,dis[5005],w;
bool vis[5005];
void add(int x,int y,double v)
{
e[++cnt].nxt=head[x];
head[x]=cnt;
e[cnt].to=y;
e[cnt].data=v;
}
int main()
{
cin >> n;
for(int i = 1;i<=n;i++)
{
cin >> x[i] >> y[i];
for(int j =i-1;j > 0;j--)
{
sum=sqrt((abs(x[i]-x[j])*1.0*abs(x[i]-x[j]))+(abs(y[i]-y[j])*1.0*abs(y[i]-y[j])));
add(i,j,sum);
add(j,i,sum);
}
}
sum=0;
for(int i = 1;i <= n;i++)
dis[i]=inf;
dis[1]=0;
int u=1;
cout << '@' << endl;
while(vis[u]==0)
{
long long minn=inf;
vis[u]=1;
for(int i = head[u];i!=0;i=e[i].nxt)
{
w=e[i].data,v=e[i].to;
if(!vis[v]&&w<dis[v])
dis[v]=w;
}
for(int i=1;i<=n;i++)
{
if(dis[i]<minn&&!vis[i])
{
minn=dis[i];
u=i;
}
}
}
for(int i=1;i<=n;i++)
{
sum+=dis[i];
}
printf("%.2lf",sum);
return 0;
}