萌新求助,为什么会有-nan【裂开】
查看原帖
萌新求助,为什么会有-nan【裂开】
352063
haochaoru楼主2023/4/29 11:43

为什么会输出-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;
}
2023/4/29 11:43
加载中...