有些玄乎
查看原帖
有些玄乎
947892
Khalil_Fong楼主2024/7/7 19:45

一:

#include<bits/stdc++.h>
using namespace std;
int n,k;
int f[1000010];
int find(int x) {
	return f[x]==x?x:f[x]=find(f[x]);
}
struct re {
	int x,y;
	double z;
} e[1000010];
double x[1000010],y[1000010];
bool cmp(re x,re y){
	return x.z<y.z;
}
int main() {
	scanf("%d%d",&n,&k);
	for(int i=1; i<=n; i++) {
		scanf("%lf%lf",&x[i],&y[i]);
	}
	int l=0;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(i==j) continue;
			e[++l].x=i;
			e[l].y=j;
			e[l].z=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
		}
	}
	for(int i=1;i<=n;i++) f[i]=i;
	sort(e+1,e+1+l,cmp);
	for(int i=1; i<=l; i++) {
		int fx=find(e[i].x);
		int fy=find(e[i].y);
		if(fx!=fy) {
			if(n==k) {
				printf("%.2lf",e[i].z);
				return 0;
			}
			f[fx]=fy;
       			n--;
		}
	}
	return 0;
}

二:

#include<bits/stdc++.h>
using namespace std;
int n,k;
int f[1000010];
int find(int x) {
	return f[x]==x?x:f[x]=find(f[x]);
}
struct re {
	int x,y;
	double z;
} e[1000010];
double x[1000010],y[1000010];
bool cmp(re x,re y){
	return x.z<y.z;
}
int main() {
	scanf("%d%d",&n,&k);
	for(int i=1; i<=n; i++) {
		scanf("%lf%lf",&x[i],&y[i]);
	}
	int l=0;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(i==j) continue;
			e[++l].x=i;
			e[l].y=j;
			e[l].z=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
		}
	}
	for(int i=1;i<=n;i++) f[i]=i;
	sort(e+1,e+1+l,cmp);
	for(int i=1; i<=l; i++) {
		int fx=find(e[i].x);
		int fy=find(e[i].y);
		if(fx!=fy) {
			if(n==k) {
				printf("%.2lf",e[i+1].z);
				return 0;
			}
			f[fx]=fy;
			n--;
		}
	}
	return 0;
}

为什么这两份代码都能通过,第一份是这样:

	if(n==k) {
		printf("%.2lf",e[i].z);
		return 0;
	}
		f[fx]=fy;
		n--;
		}

第二份是这样:

	if(n==k) {
		printf("%.2lf",e[i+1].z);
		return 0;
	}
		f[fx]=fy;
		n--;
2024/7/7 19:45
加载中...