#include<bits/stdc++.h>
#define ll long long
#define RE register
#define max(a,b) (a>b?a:b)
using namespace std;
const int N=2000005;
void read(int &x){
int flag=1;
x=0;
RE char ch=getchar();
if(ch=='-')flag=-1;
for(;ch>'9'||ch<'0';)ch=getchar();
for(;ch<='9'||ch>='0';ch=getchar())x=x*10+ch-48;
x*=flag;
}
double dist(int x1,int x2,int y1,int y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
struct node{
int u,v;
double d;
}e[N];
double maxn;
int m,n,w[N],x[N],y[N],ans,tot,fa[N],item;
bool vis[N];
int find(int x){
return fa[x]=(fa[x]==x)?x:find(fa[x]);
}
bool cmp(node a,node b){
return a.d<b.d;
}
int main(){
read(m);
for(int i=1;i<=m;i++)read(w[i]);
read(n);
for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
e[++tot].u=i;
e[tot].v=j;
e[tot].d=dist(x[i],x[j],y[i],y[j]);
}
}
for(int i=1;i<=n;i++)fa[i]=i;
sort(e+1,e+tot+1,cmp);
for(int i=1;i<=tot;i++){
int fx=find(e[i].u),fy=find(e[i].v);
if(fx==fy)continue;
maxn=max(maxn,e[i].d);
fa[fx]=fy;
++item;
if(item==n-1)break;
}
for(int i=1;i<=m;i++)
if(w[i]>=maxn)
++ans;
printf("%d",ans);
return 0;
}
算法:Kruskal克鲁斯卡尔
问题:输入无法结束
测试结果:自然全是TLE