这个 Kruskal 不知道哪里写错了,样例都过不了。
#include <bits/stdc++.h>
#define int long long
#define rd read()
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
f=ch!='-';
ch=getchar();
}
while(isdigit(ch)){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f?x:-x;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>=10) write(x/10);
putchar(x%10+48);
}
inline int quickPower(int a,int b){
int ans=1,base=a;
while(b>0){
if(b&1)
ans*=base;
base*=base;
b>>=1;
}
return ans;
}
struct Edge{
int u,v;
double w;
}edge[2000005];
int n,m,fa[5005],k,a[1005][2],ans;
double maxx,mk[5005];
inline int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
inline bool cmp(Edge x,Edge y){
return x.w<y.w;
}
inline void Kruskal(){
int tj=0;
sort(edge+1,edge+m+1,cmp);
for(int i=1;i<=m;i++){
int eu=find(edge[i].u),ev=find(edge[i].v);
if(eu==ev) continue;
maxx=edge[i].w;
fa[ev]=eu;
if(++tj==n-1){
break;
}
}
}
signed main(){
k=rd;
for(int i=1;i<=k;i++) mk[i]=rd;
n=rd;
for(int i=1;i<=n;i++) a[i][0]=rd,a[i][1]=rd;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
m++;
edge[i].u=i;
edge[i].v=j;
edge[i].w=sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]));
}
}
for(int i=1;i<=n;i++) fa[i]=i;
Kruskal();
for(int i=1;i<=k;i++){
if(maxx<=mk[i]) ans++;
}
write(ans);
return 0;
}