[HAOI2006] 聪明的猴子

求给定的一组数中,不小于点集生成树中最长边距的有多少个。

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;
}

原文地址:https://www.cnblogs.com/mollnn/p/12384927.html