为什么会输出-nan,计算距离哪里出错了?
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct dot{
int xx;
int yy;
}dots[1003];
double dis;
double ans;
int cnt;
struct edge{
int uu;
int vv;
double ww;
}edges[1000006];
bool vis[1003][1003];
int f[1003];
bool cmp(edge a,edge b) {
return a.ww<b.ww;
}
double dist(int xx,int yy) {
return sqrt((dots[xx].xx-dots[yy].xx)*(dots[xx].xx-dots[yy].xx)+(dots[xx].yy-dots[yy].yy)*(dots[xx].yy-dots[yy].yy));
}
int cntt;
double ed;
int find(int xx) {
if(xx==f[xx]) return xx;
return f[xx]=find(f[xx]);
}
void merge(int xx,int yy) {
int fx=find(xx);
int fy=find(yy);
f[fx]=fy;
}
void kru() {
sort(edges+1,edges+cnt+1,cmp);
for(int i=1;i<=cnt;++i) {
int fu=find(edges[i].uu);
int fv=find(edges[i].vv);
if(fu==fv) continue;
merge(edges[i].uu,edges[i].vv);
// printf("asd%lf\n", ans);
// if(isnan(edges[i].ww)) printf("%d %d %d %d\n", dots[edges[i].uu].xx,dots[edges[i].vv].xx,dots[edges[i].uu].yy,dots[edges[i].vv].yy);
// printf("ad%lf\n", edges[i].ww);
ans+=edges[i].ww;
cntt++;
if(cntt==n-1) return;
}
}
int main() {
freopen("P2872_2.in","r",stdin);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i) {
f[i]=i;
}
for(int i=1;i<=n;++i) {
scanf("%d %d",&dots[i].xx,&dots[i].yy);
}
for(int i=1;i<=m;++i) {
cnt++;
scanf("%d %d",&edges[cnt].uu,&edges[cnt].vv);
merge(edges[cnt].uu,edges[cnt].vv);
}
for(int i=1;i<=n;++i) {
for(int j=i+1;j<=n;++j) {
dis=dist(i,j);
cnt++;
edges[cnt].uu=i;
edges[cnt].vv=j;
edges[cnt].ww=dis;
}
}
kru();
printf("%.2lf\n", ans);
return 0;
}