求给定的一组数中,不小于点集生成树中最长边距的有多少个。
Solution
裸题。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2005;
struct edge {
int u,v;
double w;
bool operator < (const edge &b) {
return w<b.w;
}
} e[N*N];
int n,m,x[N],y[N],fa[N],a[N];
int find(int p) {
return fa[p]==p?p:fa[p]=find(fa[p]);
}
void merge(int p,int q) {
p=find(p);
q=find(q);
if(p-q) fa[p]=q;
}
signed main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;
for(int i=1;i<=m;i++) cin>>x[i]>>y[i];
int ind=0;
for(int i=1;i<=m;i++) {
for(int j=1;j<i;j++) {
e[++ind]=(edge){i,j,sqrt((x[i]-x[j])*(x[i]-x[j])+
(y[i]-y[j])*(y[i]-y[j]))};
}
}
sort(e+1,e+ind+1);
double tmp = 0;
for(int i=1;i<=m;i++) fa[i]=i;
for(int i=1;i<=ind;i++) {
if(find(e[i].u)!=find(e[i].v)) {
merge(e[i].u,e[i].v);
tmp=max(tmp,e[i].w);
}
}
int ans=0;
for(int i=1;i<=n;i++) if(a[i]>=tmp) ++ans;
cout<<ans;
}