各位大佬还有没有可以优化空间的方法
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <iomanip>
#include <cmath>
using namespace std;
const int maxv=5000;
const double inf=1e9;
int n,m,x[maxv],y[maxv];
double d[maxv];
bool vis[maxv];
struct Node
{
int v;
double dis;
}node;
double ans=0;
vector<Node> adj[maxv];
void prim()
{
fill(d,d+maxv,inf);
d[1]=0;
for(int i=1;i<=n;i++)
{
int u=-1,Min=inf;
for(int j=1;j<=n;j++)
{
if(vis[j]==false&&d[j]<Min)
{
u=j;
Min=d[j];
}
}
if(u==-1)
{
return;
}
ans+=d[u];
vis[u]=1;
for(int j=0;j<adj[u].size();j++)
{
int v=adj[u][j].v;
double dis=adj[u][j].dis;
if(dis<d[v]&&vis[v]==false)
{
d[v]=dis;
}
}
}
return;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
}
m=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
{
continue;
}
double dis=0;
if(x[i]!=x[j]&&y[i]==y[j])
{
dis=abs(x[j]-x[i]);
}
else if(x[i]==x[j]&&y[i]!=y[j])
{
dis=abs(y[i]-y[j]);
}
else if(x[i]!=x[j]&&y[i]!=y[j])
{
double a=abs(x[i]-x[j]);
double b=abs(y[i]-y[j]);
dis=sqrt((double)(a*a+b*b));
}
node.v=j;
node.dis=dis;
adj[i].push_back(node);
m++;
}
}
m-=1;
prim();
ans=(long long)(ans*100+0.5)/100.0;
cout<<fixed<<setprecision(2)<<ans;
return 0;
}