一:
#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--;