思路:猴子跳跃距离比最小生成树中的最长边还长,那肯定可以遍历所用点
okk:(又是几乎模板啦~)
#include<bits/stdc++.h>
using namespace std;
int n,m,k,ans=0,cnt;
double sum=-1;
int a[1000005][3],b[1000005],pre[1000005];// 前面一直RE,开大一点;
struct zzz {
int x,y;
double p;
} z[1000005];
int cmp(zzz k,zzz d) {
return k.p<d.p;
}
int find(int x) {
return pre[x]==x?x:pre[x]=find(pre[x]);
}
void init(){
for(int i=1; i<=n; i++) pre[i]=i;
}
void kruskal(){
for(int i=1; i<=k; i++) {
int s1=find(z[i].x),s2=find(z[i].y);
if(s1!=s2) {
pre[s1]=s2;
cnt++;
sum=z[i].p;
}
if(cnt==n-1) break;
}
}
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>m;
for(int i=1; i<=m; i++) cin>>b[i];
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i][1]>>a[i][2];
for(int i=1; i<n; i++) {
for(int j=i+1; j<=n; j++) {
k++;
z[k].x=i;
z[k].y=j;
z[k].p=sqrt((a[i][1]-a[j][1])*(a[i][1]-a[j][1])+(a[i][2]-a[j][2])*(a[i][2]-a[j][2]));
}
}
sort(z+1,z+k+1,cmp);
init();
kruskal();
for(int i=1; i<=m; i++) {//比较
if(sum<=b[i])
ans++;
}
cout<<ans<<"\n";//完美输出
return 0;
}
over~